home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / ab20 / aplictns / analyclc.lzh / Analy.For < prev    next >
Text File  |  1990-08-28  |  629KB  |  22,578 lines

  1. c ********** ANALYAC.FTN ##########################################
  2. C This version of AnalytiCalc uses the include file AParms.inc to
  3. C contain parameters. These specify the "prime area" of the
  4. C spreadsheet, and also the size of in-memory buffers that
  5. C are used for in-memory storage of spreadsheet data. Larger
  6. C spreadsheets may of course be stored using the software
  7. C paging built in, but at much reduced speed.
  8. C  Glenn Everhart 9/20/1989
  9. C
  10. C parameter relationships implicit below:
  11. C mval, nominal 800, multiple of 100
  12. C mfrm, nominal 2048, multiple of 128
  13. C Mvlov2=mval/2
  14. C mfrmo2=mfrm/2
  15. C MVal/16=mvlo16
  16. C mfrm/64=mfro64
  17. c -h- analy.for    Fri Aug 22 12:54:45 1986    
  18.        PROGRAM ANALY(INPUT=15,OUTPUT=16,TAPE=17,ERR=1)
  19. C ANALYTICALC MAIN PROGRAM
  20. C SPREAD SHEET DRIVER PROGRAM
  21.     Include aparms.inc
  22. C COPYRIGHT (C) 1983-1990 GLENN AND MARY EVERHART
  23. C ALL RIGHTS RESERVED
  24. C MAX SHEET DIMS ARE MCOLS BY mrows-1 (MROWS SINCE ACCUMULATORS ARE A PSEUDO ROW)
  25. C NOTE: THROUGHOUT, ROWS ARE ACTUALLY DOWN, COLUMNS ACROSS ON
  26. C SCREEN. ROW 0 IN DISPLAY IS THE 27 ACCUMULATORS A-Z AND %, WITH
  27. C % BEING THE LAST-COMPUTED VALUE FROM THE CALC PROGRAM, WHICH
  28. C KNOWS HOW TO ACCESS THE DATA BUT IS JUST PASSED COMMAND STRINGS
  29. C FROM THE DISK BASED FILE HERE.
  30. C
  31.     InTeGer*4 PRL(6)
  32.         CHARACTER*1 NOWRAP ( 2 )
  33.     CHARACTER*1 FORM,FVLD,CMDLIN(132)
  34.     INTEGER*4 VNLT
  35.     INTEGER IFCW
  36. C    EXTERNAL LCWRQQ
  37.     DIMENSION FORM(128),FVLD(1,1)
  38. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  39. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  40. C SO INITIALLY IGNORE.
  41. C
  42. C ROUTINE IN2AS COMPUTES ASCII CHARACTER NAMES OF SUBSCRIPTS IN1,IN2
  43. C SO DISPLAY CAN HAVE THEM. IT MUST BE THE INVERSE OF VARSCN.
  44. C
  45. C ***<<<< RDD COMMON START >>>***
  46.     InTeGer*4 RRWACT,RCLACT
  47. C    COMMON/RCLACT/RRWACT,RCLACT
  48.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  49.      1  IDOL7,IDOL8
  50. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  51. C     1  IDOL7,IDOL8
  52.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  53. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  54.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  55. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  56. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  57. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  58.     InTeGer*4 KLVL,k3dfg,kcdelt,krdelt,kpag
  59. C    COMMON/KLVL/KLVL
  60.     InTeGer*4 IOLVL,igold
  61. C    COMMON/IOLVL/IOLVL
  62. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  63. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  64.     Integer*4 Idsptp,Idol9
  65.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  66.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  67.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  68.      3  k3dfg,kcdelt,krdelt,kpag
  69. C ***<<< RDD COMMON END >>>***
  70.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  71.     COMMON/D2R/NRDSP,NCDSP
  72.     InTeGer*4 TYPE(1,1),VLEN(9)
  73.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1)
  74.     REAL*8 XXV(1,1)
  75.     EQUIVALENCE(XXV(1,1),VBLS(1,1,1))
  76.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  77. C DEFFMT IS THE DEFAULT FORMAT FOR NUMERICS. INITIALLY IT WILL BE F9.2
  78.     CHARACTER*1 DVFMT(12),DEFFMT(10)
  79.     EQUIVALENCE(DVFMT(2),DEFFMT(1))
  80.     CHARACTER*12 CDVFMT
  81.     EQUIVALENCE(CDVFMT(1:1),DVFMT(1))
  82.     COMMON/DEFVBX/DVFMT
  83.     CHARACTER*1 NMSH(80)
  84.     CHARACTER*80 NMSH80
  85.     EQUIVALENCE(NMSH80(1:1),NMSH(1))
  86.     COMMON/NMSH/NMSH
  87.     CHARACTER*1 FORM2(4)
  88. C ***<<< XVXTCD COMMON START >>>***
  89.     CHARACTER*1 OARRY(100)
  90.     InTeGer*4 OSWIT,OCNTR
  91. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  92. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  93.     InTeGer*4 IPS1,IPS2,MODFLG
  94. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  95.        InTeGer*4 XTCFG,IPSET,XTNCNT
  96.        CHARACTER*1 XTNCMD(80)
  97. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  98. C VARY FLAG ITERATION COUNT
  99.     INTEGER KALKIT
  100. C    COMMON/VARYIT/KALKIT
  101.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  102.     InTeGer*4 RCMODE,IRCE1,IRCE2
  103. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  104. C     1  IRCE2
  105. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  106. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  107. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  108. C RCFGX ON.
  109. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  110. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  111. C  AND VM INHIBITS. (SETS TO 1).
  112.     INTEGER*4 FH
  113. C FILE HANDLE FOR CONSOLE I/O (RAW)
  114. C    COMMON/CONSFH/FH
  115.     CHARACTER*1 ARGSTR(52,4)
  116. C    COMMON/ARGSTR/ARGSTR
  117.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  118.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  119.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  120.      3  IRCE2,FH,ARGSTR
  121. C ***<<< XVXTCD COMMON END >>>***
  122. C
  123. C DISPLAY ARRAY WILL KEEP A COPY OF VARIABLES DISPLAYED AND FORMATS
  124. C USED LOCALLY WHICH DISPLAY ROUTINE CAN USE TO SEE WHAT ACTUALLY
  125. C NEEDS TO BE REFRESHED ON SCREEN. DRWV AND DCLV ARE COLS, ROWS OF
  126. C DISPLAY ACTUALLY USED FOR SCREEN.
  127.     InTeGer*4 CWIDS(20)
  128. C CWIDS IS WIDTHS IN CHARACTERS OF COLUMNS ON DISPLAY. NOTE THAT BECAUSE
  129. C OF PECULIAR INVERSION WHICH I AM TOO LAZY TO CORRECT IT IS DIMENSIONED
  130. C AS 20 NOT 75.
  131.     INTEGER*4 I4TMP
  132.     REAL*8 DVS(20,75)
  133.     COMMON /FVLDC/FVLD
  134. C FOLLOWING SUPPORT VVARY OVERLAY:
  135.     REAL*8 QQAC(26),QDERIV(8),QDEL(8),OLDVV,OLDX,OLDA
  136.     InTeGer*4 QCAC,QCENT(8),ACV(8)
  137.     COMMON/VRYDAT/QQAC,QDERIV,QDEL,QCAC,QCENT,OLDVV,OLDX,OLDA,ACV
  138. C BITMAP
  139. C    CHARACTER*1 IBITMP
  140. C    DIMENSION IBITMP(2258)
  141. C    COMMON/INITD/IBITMP
  142. C    CHARACTER*1 DFMTS(10,20,75)
  143. C 10 CHARACTERS PER ENTRY.
  144.     COMMON/DSPCMN/DVS,CWIDS
  145. C    character*35 fwt
  146. C COMMONS FROM OTHER MISC. ROUTINES, ADDED TO ALLOW AMIGA FORTRAN TO
  147. C ALLOCATE COMMONS ON STACK...
  148.     CHARACTER*1 LBITS(8)
  149.     COMMON/BITS/LBITS
  150.     CHARACTER*1 ALPHA(27),COMMA,BLANK,RPAR,LPAR,EQ
  151.     COMMON/CONS/ALPHA,COMMA,BLANK,RPAR,LPAR,EQ
  152.     CHARACTER*1 DTBL1(9,9,8)
  153.     COMMON/DECIDE/DTBL1
  154.     CHARACTER*1 DIGITS(16,3)
  155.     COMMON/DIGV/DIGITS
  156. C ***<<< KLSTO COMMON START >>>***
  157.     InTeGer*4 DLFG
  158. C    COMMON/DLFG/DLFG
  159.     InTeGer*4 KDRW,KDCL
  160. C    COMMON/DOT/KDRW,KDCL
  161.     InTeGer*4 DTRENA
  162. C    COMMON/DTRCMN/DTRENA
  163.     REAL*8 EP,PV,FV
  164.     DIMENSION EP(20)
  165.     INTEGER*4 KIRR
  166. C    COMMON/ERNPER/EP,PV,FV,KIRR
  167.     InTeGer*4 LASTOP
  168. C    COMMON/ERROR/LASTOP
  169.     CHARACTER*1 FMTDAT(9,76)
  170. C    COMMON/FMTBFR/FMTDAT
  171.     CHARACTER*1 EDNAM(16)
  172. C    COMMON/EDNAM/EDNAM
  173.     InTeGer*4 MFID(2),MFMOD(2)
  174. C    COMMON/FRM/MFID,MFMOD
  175.     InTeGer*4 JMVFG,JMVOLD
  176. C    COMMON/FUBAR/JMVFG,JMVOLD
  177.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  178.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  179. C ***<<< KLSTO COMMON END >>>***
  180. C
  181. C
  182.         CHARACTER*1 FV1(Imp1s),FV2(Imp1s),FV4(Imp1s)
  183.     CHARACTER*1 FVXX(Imps3)
  184.     EQUIVALENCE (FV1(1),FVXX(1)),(FV2(1),FVXX(Imp2s))
  185.     EQUIVALENCE (FV4(1),FVXX(Imp3s))
  186.         Common/FVLDM/FVXX
  187. c        COMMON/FVLDM/FV1,FV2,FV4
  188.     InTeGer*2 IFID(8,MFrm)
  189.     COMMON/IFIDC/IFID
  190.     InTeGer*4 ILNFG,ILNCT
  191.     CHARACTER*1 ILINE(106)
  192.     COMMON/ILN/ILNFG,ILNCT,ILINE
  193.     InTeGer*4 ITCNTV(6)
  194.     COMMON/ITERA/ITCNTV
  195.     InTeGer*4 MFIOPN,MFIRL,MFIRH,MFICL,MFICH
  196.     InTeGer*4 MFOOPN,MFORL,MFORH,MFOCL,MFOCH
  197.     InTeGer*4 MFILUN,MFOLUN,MFIFLG,MFOFLG
  198.     COMMON/MFILES/MFIOPN,MFOOPN,MFIRL,MFIRH,MFICL,MFICH,
  199.      1  MFORL,MFORH,MFOCL,MFOCH,MFILUN,MFOLUN,MFIFLG,MFOFLG
  200. C ***<<< NULETC COMMON START >>>***
  201.     InTeGer*4 ICREF,IRREF
  202. C    COMMON/MIRROR/ICREF,IRREF
  203.     InTeGer*4 MODPUB,LIMODE
  204. C    COMMON/MODPUB/MODPUB,LIMODE
  205.     InTeGer*4 KLKC,KLKR
  206.     REAL*8 AACP,AACQ
  207. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  208.     InTeGer*4 NCEL,NXINI
  209. C    COMMON/NCEL/NCEL,NXINI
  210.     CHARACTER*1 NAMARY(20,MROWS)
  211. C    COMMON/NMNMNM/NAMARY
  212.     InTeGer*4 NULAST,LFVD
  213. C    COMMON/NULXXX/NULAST,LFVD
  214.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  215.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  216. C ***<<< NULETC COMMON END >>>***
  217.     CHARACTER*1 STACK1(8,40),STACK2(8,40)
  218.     InTeGer*4 ST1PT,ST2PT,ST1TYP(40),ST2TYP(40),ST1LIM,ST2LIM
  219.     COMMON/STACK/STACK1,STACK2,ST1PT,ST2PT,ST1TYP,ST2TYP,
  220.      1  ST1LIM,ST2LIM
  221.     InTeGer*4 IATYP(27),LINTGR
  222.     CHARACTER*1 ITYP(Imp1s)
  223.     COMMON/TYP/IATYP,ITYP,LINTGR
  224.     InTeGer*4 MPAG(2),MPMOD(2)
  225.     InTeGer*2 LVALBF(5,800)
  226.     COMMON/VB/MPAG,LVALBF,MPMOD
  227.     InTeGer*4 MFLAST,MFBASE,MVLAST,MVBASE
  228.     COMMON/VBCTL/MFLAST,MFBASE,MVLAST,MVBASE
  229.     InTeGer*4 LEVEL,NONBLK,LEND,VIEWSW,BASED
  230.     CHARACTER*1 LINE(80)
  231.     COMMON LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  232. C *** END COMMONS FROM OTHER PLACES.
  233.     Character*1 IYN
  234.     FH=0
  235.     NCEL=0
  236. c    IFCW=4927
  237. C DISABLE FLOATING EXCEPTIONS
  238. c    CALL LCWRQQ(IFCW)
  239. C INITIAL DEFAULT FORMAT FOR NUMERICS is set at runtime
  240. C INIT COMMON DATA FIRST OF ALL.
  241.     IDOL7=1
  242. C INITIALLY IN ANSI MODE. STILL USE ANSI DRIVER FOR INPUT CONTROLS.
  243. C NOW SET UP OTHER COMMON INFO (USED TO BE A BLOCK DATA...NOW CHANGED.)
  244.     CALL BLOCK
  245.     IKONS=0
  246.     write(*,6402)
  247. 6402    Format(' Compiled by Absoft Fortran 2.3.')
  248.         IYN=27
  249.         Write(*,6398)iyn,iyn
  250. 6398    Format(A,'[H',A,'[J')
  251.     Write(*,6403)
  252. 6403    Format(' Is Workbench screen 640 by 400 or over [Y/N]:')
  253.     IDSPTP=0
  254.     Read(*,6406)IYN
  255. 6406    Format(1A1)
  256.     If(IYN.eq.'Y'.or.IYN.eq.'y')IDSPTP=1
  257. c IDSPTP now is 0 for non interlace, 1 for interlace.
  258.     CALL INITA1(KMAP,KWID,ICODE)
  259. 3002    CONTINUE
  260.     CALL INITA2(KMAP,KWID,ICODE,IKONS)
  261.     IKONS=1
  262. 3000    CONTINUE
  263.     CALL INITB(KMAP,KWID,ICODE)
  264.     LINIZZ=0
  265. C    IF(IOLDFL.GT.1)GOTO 2000
  266. 2000    CONTINUE
  267. C DRAW OUR LABELS AND OTHERWISE INITIALIZE DISPLAY SHEET
  268.     KZPPD=0
  269.     IF(IPSET.NE.0)GOTO 1000
  270.     IF(PZAP.EQ.0)CALL UVT100(11,2,0)
  271.     CALL UVT100(1,1,1)
  272.     OSWIT=20
  273.     IPRSS=PROW
  274.     IPCSS=PCOL
  275.     IDRW=DROW
  276.     IDCL=DCOL
  277.     IF(LINIZZ.LE.1)CALL RECALC
  278.     IF(PZAP.EQ.0)CALL DSPSHT(2)
  279.     DCOL=IDCL
  280.     DROW=IDRW
  281.     PROW=IPRSS
  282.     PCOL=IPCSS
  283. 3006    FORMAT(80A1)
  284. C
  285. 1000    CONTINUE
  286.     IPSET=0
  287.     LINIZZ=LINIZZ+1
  288.     OSWIT=20
  289. C ISSUE A PROMPT FOR COMMAND AND DO A COMMAND
  290.     ICODE=0
  291.     CALL XQTCMD(ICODE)
  292.     IF(ICODE.LT.30)GOTO 1843
  293. C HELP COMMAND AND SIMILAR...
  294.     IF(ICODE.NE.400)GOTO 1847
  295.     CALL DSPSHT(10)
  296.     ICODE=1
  297. C CODE 10 IS PRINT SECRET CODE TO DSPSHT.
  298.     GOTO 1843
  299. 1847    CONTINUE
  300.     IF(ICODE.NE.420)GOTO 1849
  301. C CLOSE UNIT 1 JUST IN CASE...
  302.     CLOSE(1)
  303.     KLVL=1
  304.     IPRSSS=PROW
  305.     IPCSSS=PCOL
  306.     CALL CALC
  307.     PROW=IPRSSS
  308.     PCOL=IPCSSS
  309. C CLOSE CONSOLE LUN USED BY CALC.
  310.     CLOSE(1)
  311. C CLOSE ANY OTHER LUNS CALC MAY HAVE USED...
  312.     CLOSE(2)
  313.     CLOSE(3)
  314. C SET UP FOR REDRAW WHEN BACK...
  315.     ICODE=-1
  316.     GOTO 1843
  317. 1849    CONTINUE
  318.     IF(ICODE.NE.430)GOTO 1845
  319. C TEST FUNCTION, TESTING EXPRESSION.
  320. C INHIBIT RECALCULATION...
  321. C COMMAND IS IN "XTNCMD" STRING.
  322.     LLST=MIN0(80,XTNCNT+1)
  323.     LFST=1
  324.     CALL DOENTR(XTNCMD,LFST,LLST)
  325. C THIS SETS % VARIABLE AND WILL DO A CALC DIRECTLY. THEREFORE
  326. C WE MUST INHIBIT AUTO RECALCULATION.
  327. C NOTE WE HAVE TO CALL THIS FROM THE ROOT SINCE THE RECALC OVERLAY
  328. C TREE OVERWRITES THE XQTCMD ONE.
  329.     ICODE=1
  330.     GOTO 1843
  331. 1845    CONTINUE
  332.     IVVV=ICODE-30
  333. 9308    CALL HELP(IVVV)
  334.     IVVV=0
  335.     CALL VWRT('Type return to continue, Hn for other Help pages:',
  336.      1  49)
  337.     ILL=IOLVL
  338. C    IF(ILL.EQ.5)ILL=0
  339.     if(ill.ne.11)READ(ILL,3006,END=5600,ERR=5600)(FORM2(K),K=1,4)
  340.     if(ill.eq.11)call vget(form2,4)
  341.     IVVVV=ichar(FORM2(2))
  342.     IF(IVVVV.GE.48.AND.IVVVV.LE.57)IVVV=IVVVV-48
  343.     IF(FORM2(1).EQ.'H'.OR.FORM2(1).EQ.'h')GOTO 9308
  344. C NOW CLEAR SCREEN AND TRY MORE COMMANDS AS BEFORE...
  345.     ICODE=6
  346. C
  347. 1843    CONTINUE
  348.     OSWIT=20
  349.     IPRSS=PROW
  350.     IPCSS=PCOL
  351.     IDRW=DROW
  352.     IDCL=DCOL
  353.     IF(LINIZZ.LE.1)CALL RECALC
  354.     IF(IPSET.NE.0)GOTO 4110
  355.     DCOL=IDCL
  356.     DROW=IDRW
  357.     PROW=IPRSS
  358.     PCOL=IPCSS
  359. 4110    CONTINUE
  360.     IPSET=0
  361.     IF(ICODE.EQ.-1)GOTO 2000
  362. C IN PORTACALC-VM, S COMMAND ALLOWS DEFAULT FORMAT CHANGE AND
  363. C TITLE CHANGE, BUT DOES NOT ALTER SHEET IN MEMORY... DON'T ALLOW
  364. C SCRATCH FILE SAVE STUFF...
  365. C    IF(ICODE.EQ.-2)CALL WRKFIL(1,FORM,3)
  366. C    IF (ICODE.EQ.-2)CALL CLOSE(7)
  367.     IF(ICODE.LE.-2)GOTO 3002
  368. C
  369. C RECALCULATE SHEET NOW AUTOMAGICALLY
  370. C IF ICODE=1, COMMAND JUST MOVES ON DISPLAY, SO NO NEED TO RECALCULATE
  371. C THE ENTIRE SHEET.
  372. C LIMIT NUMBER OF ITERATIONS AT ANY ONE TIME TO 20 HOWEVER
  373.     KKMAX=20
  374. 3670    CONTINUE
  375.     IF(ICODE.EQ.5.OR.ICODE.EQ.1
  376.      1  .OR.ICODE.EQ.6.OR.RCFGX.EQ.1)GOTO 3671
  377.     CALL RECALC
  378.     IPSET=0
  379.     KKMAX=KKMAX-1
  380. C IMPLEMENT VARY LOOP...
  381. C ASSUME USRFCT MUSTR CONTOL KALKIT VARIABLE THEN TO GET LOOP TO
  382. C TERMINATE SOMETIME.
  383.     KKMAX=MIN0(KKMAX,KALKIT)
  384.     IF(KKMAX.GT.0)GOTO 3670
  385. 3671    CONTINUE
  386. C    IF(ICODE.NE.1.AND.RCFGX.NE.1)CALL RECALC
  387. C
  388. C DISPLAY SHEET NOW. ONLY ALTERS ENTRIES INVALIDATED BY COMMAND.
  389.     IF(ICODE.NE.2.AND.ICODE.NE.6)GOTO 21
  390. C ICODE=2 = REFRESH DISPLAY. ZERO ALL NUMBERS AND CAUSE TOTAL REDISPLAY.
  391.     DO 22 N1=1,20
  392.     DO 22 N2=1,75
  393. C SET NUMBER DISPLAYED TO WEIRD VALUE.
  394. 22    DVS(N1,N2)=DVS(N1,N2)+.000000000034
  395.     IF(PZAP.EQ.0)CALL UVT100(11,2,0)
  396.     CALL UVT100(1,1,1)
  397. 21    CONTINUE
  398.     IF(ICODE.EQ.6)ICODE=2
  399.     IF(ICODE.NE.5.AND.PZAP.EQ.0)CALL DSPSHT(ICODE)
  400.     DCOL=IDCL
  401.     DROW=IDRW
  402.     PROW=IPRSS
  403.     PCOL=IPCSS
  404.     GOTO 1000
  405. 5600    CONTINUE
  406. C ERROR ON READ FROM IOLVL HANDLED HERE.
  407. c    REWIND 5
  408. c    CLOSE(11)
  409. c    OPEN(11,FILE='CON:50/150/300/40/Analy Command',STATUS='OLD',
  410. c     1  FORM='FORMATTED')
  411.     CLOSE(3)
  412.     IOLVL=11
  413.     GOTO 1000
  414.     END
  415. c -h- assign.for    Fri Aug 22 12:56:01 1986    
  416.     SUBROUTINE ASSIGN(IUNIT,NAME)
  417. C
  418. C
  419.     CHARACTER*1 NAME(50)
  420.     InTeGer*4 IUNIT
  421. C &&&& MS FTN 3.2
  422.     LOGICAL LEXIST
  423. C &&&&
  424.     CHARACTER*20 WK
  425.     CHARACTER*1 WK1(20)
  426.     EQUIVALENCE(WK(1:1),WK1(1))
  427. C JUST TRY AND NULL FILL A NAME TO USE.
  428.     DO 1 N=1,20
  429.     WK1(N)=' '
  430. 1    CONTINUE
  431.     DO 2 N=1,20
  432.     II=ICHAR(NAME(N))
  433.     IF(II.LT.32)GOTO 3
  434.     WK1(N)=CHAR(II)
  435. C1    CONTINUE
  436. 2    CONTINUE
  437. 3    CONTINUE
  438. C CHECK FOR NONEXISTENT FILE FIRST AND CREATE AN EMPTY ONE
  439. C IF POSSIBLE, THEN CLOSE AND OPEN FOR READ. THIS MAY
  440. C AVOID CRASHES IF THE FILE ISN'T THERE...
  441. C MSDOS FORTRAN 3.2 AND LATER FEATURE...
  442. C &&&&
  443. C
  444. C    INQUIRE(FILE=WK,EXIST=LEXIST,ERR=77)
  445. C
  446.     INQUIRE(FILE=WK,EXIST=LEXIST)
  447.     IF(LEXIST)GOTO 100
  448. C FILE DOES NOT EXIST, SO CREATE IT HERE.
  449. C IF CREATE FAILS WE LOSE TOO...
  450.     CALL UVT100(1,1,1)
  451.     CALL SWRT('File not found. Using window instead.',37)
  452.     Open(IUNIT,'CON:200/100/300/80/Nonexistent file')
  453. C OPENS AND CLOSES FILE, CREATING A NULL FILE TO READ.
  454. C WILL GET EOF ON START, BUT THAT'S TOO BAD...
  455.     Return
  456. 100    CONTINUE
  457. C &&&&
  458. C IF JUST CALL ASSIGN, ASSUME FOR READ.
  459.     OPEN(IUNIT,FILE=WK,STATUS='OLD',ACCESS='SEQUENTIAL',
  460.      1  FORM='FORMATTED')
  461. 77    CONTINUE
  462. C ON ERRORS IN INQUIRE, ASSUME AN ILLEGAL DEVICE OR SOMETHING
  463. C ELSE WEIRD AND JUST DON'T BOTHER WITH THE OPEN.
  464.     RETURN
  465.     END
  466. c -h- at.for    Fri Aug 22 12:56:23 1986    
  467.     SUBROUTINE AT (RETCD)
  468. C COPYRIGHT (C) 1983 GLENN EVERHART
  469. C ALL RIGHTS RESERVED
  470. C 60=MAX REAL ROWS
  471. C 301=MAX REAL COLS
  472. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  473. C VBLS AND TYPE DIMENSIONED 60,301
  474. C *******************************************************
  475. C *                                                     *
  476. C *           SUBROUTINE  AT                            *
  477. C *                                                     *
  478. C *******************************************************
  479. C SUBROUTINE AT IS CALLED WHEN THE  *@  CALC COMMAND IS ENCOUNTERED.
  480. C IT CHANGES  THE  VALUE  OF LEVEL  WHICH  HOLDS THE  NUMBER OF THE
  481. C LOGICAL  I/O  UNIT WHERE INPUT COMMAND LINES ARE TO BE OBTAINED.
  482. C THE FILE ASSOCIATED WITH THAT I/O UNIT IS OPENED UNDER THE PROPER
  483. C CONDITIONS.
  484. C
  485. C MODIFICATION CLASSES: M1,M2,M9
  486. C
  487. C      MODIFIED 3-OCT-77 P.B.
  488. C      MODIFIED 10-JAN-78 P.B.  TO PUT SY: BEFORE FILENAMES
  489. C         WITH NO DEVICE SPECIFIED SO THAT DEFAULT IS USER'S SY:
  490. C         AND NOT THE SYSTEM SY:
  491. C
  492. C
  493. C    AT CALLS
  494. C
  495. C  ASSIGN  (TO ASSOCIATE A FILE NAME WITH A LOGICAL I/O UNIT)
  496. C  ERRMSG  (TO PRINT ERROR MESSAGES)
  497. C  GETNNB  (TO GET NEXT NON-BLANK FROM THE INPUT LINE)
  498. C  ZNEG    (TO TEST IF A VARIABLE IS POSITIVE)
  499. C
  500. C
  501. C
  502. C   AT IS CALLED BY ROUTINE CMND WHICH IS THE MODULE THAT DETERMINES
  503. C   WHAT CALC COMMAND WAS REQUESTED.
  504. C
  505. C
  506. C
  507. C         VARIABLE          USE
  508. C
  509. C   ALPHA(27)         HOLDS LEGAL VARIABLE NAMES.
  510. C   I,J               HOLD TEMPORARY VALUES.
  511. C   IPT               POINTS TO NEXT NON-BLANK CHARACTER IN LINE(80).
  512. C   ITCNTV(6)         INDEXED BY LEVEL. HOLDS 0 IF NO ITERATION ON THAT
  513. C                     LEVEL, OTHERWISE INDEX INTO VBLS FOR THE VARIABLE
  514. C                     THAT CONTROLS ITERATION.
  515. C   LEVEL             HOLDS NUMBER OF LOGICAL I/O UNIT WHERE NEXT INPUT
  516. C                     LINE IS EXPECTED.
  517. C   LINE(80)          HOLDS COMMAND INPUT LINE.
  518. C   NBLINE(78)        HOLDS THE INPUT FILE NAME WITHOUT BLANKS.
  519. C   NONBLK            POINTS TO THE LAST NON-BLANK CHARACTER IN LINE(80).
  520. C   RETCD             RETURN CODE: 1=O.K.  2=ERROR.
  521. C   SY                "SY:" USED TO OPEN FILES WITH A DEFAULT OF
  522. C                     USER'S SY: (OTHERWISE SYSTEM SY: IS USED) P.B.
  523. C                     10-JAN-78
  524. C
  525. C
  526. C
  527. C    SUBROUTINE AT (RETCD)
  528. C
  529.     InTeGer*4 IPT,J,I
  530.     InTeGer*4 LEVEL,NONBLK,LEND
  531.     InTeGer*4 RETCD,VIEWSW,BASED
  532.     InTeGer*4 ITCNTV(6),ZNEG
  533. C
  534.     CHARACTER*1  LINE(80),NBLINE(78)
  535.     CHARACTER*1 ALPHA(27),COMMA,BLANK,RPAR,LPAR,EQ
  536. C    CHARACTER*1 SY(3)
  537. C
  538. C
  539.     COMMON  LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  540.     COMMON /CONS/ ALPHA,COMMA,BLANK,RPAR,LPAR,EQ
  541.     COMMON/ITERA/ITCNTV
  542. C
  543. C    DATA SY/'S','Y',':'/
  544. C
  545. C
  546. C
  547. C UPON ENTRANCE, NONBLK POINTS TO THE CHARACTER @
  548. C
  549. C  MODIFICATION CLASSES:  M1,M2,M9
  550. C
  551. C PICK UP FIRST NON-BLANK AFTER THE @
  552.     CALL GETNNB(IPT,RETCD)
  553.     GO TO (10,1050),RETCD
  554.     STOP 10
  555. C
  556. C
  557. C START BUILDING FILE NAME AS A COMPRESSED VERSION (BLANKS REMOVED)
  558. C OF THE REST OF LINE(80)
  559. 10    J=0
  560. 15    NONBLK=IPT
  561.     J=J+1
  562.     NBLINE(J)=LINE(NONBLK)
  563.     CALL GETNNB(IPT,RETCD)
  564.     GO TO (15,50),RETCD
  565.     STOP 50
  566. C
  567. C
  568. C SET RETURN CODE AND INDICATE THAT WE WILL BE AT A NEW LEVEL.
  569. C J HOLDS THE COUNT OF THE NUMBER OF CHARACTERS IN NBLINE.
  570. C IF J=1 THEN NO ITERATION IS POSSIBLE BECAUSE FILENAME IS THE
  571. C SINGLE CHARACTER.
  572. 50    RETCD=1
  573.     LEVEL=LEVEL+1
  574.     IF (LEVEL.GT.6) GOTO 1000
  575. C
  576.     IF(J.EQ.1) GO TO 200
  577. C
  578. C NBLINE HOLDS THE COMPRESSED FILENAME. NOW WE CHECK TO SEE IF AN
  579. C ITERATION VARIABLE WAS SPECIFIED. THIS IS INDICATED BY A LEGAL
  580. C VARIABLE NAME PRECEEDED BY A BLANK (IN LINE(80))
  581. C NOTE THAT ONLY ONE OF THE ACCUMULATORS A-Z MAY BE USED FOR THIS.
  582.     DO 60 I=1,27
  583. C A-Z OR % LEGAL
  584.     IF(ALPHA(I).EQ.LINE(NONBLK))GO TO 100
  585. 60    CONTINUE
  586.     GO TO 200
  587. 100    IF(LINE(NONBLK-1).NE.BLANK)GO TO 200
  588. C
  589. C
  590. C ITERATION INDICATOR IS PRESENT
  591. C (ALPHABETIC CHARACTER OR % PRECEEDED BY A BLANK)
  592. C IF THE VALUE OF THE VARIABLE IS NOT POSITIVE, THE FILE IS IGNORED.
  593.     IF(ZNEG(I).EQ.1)GO TO 150
  594. C
  595. C
  596. C RETAIN INDEX INTO VBLS AND DECREASE J SO THAT THE FILENAME
  597. C DOES NOT INCLUDE THE ITERATION SPECIFICATION.
  598.     ITCNTV(LEVEL)=I
  599.     J=J-1
  600.     GO TO 300
  601. C
  602. C
  603. C FILE NOT ENTERED, ITERATION VARIABLE IS ZERO, NEGATIVE, OR UNDEFINED
  604. 150    LEVEL=LEVEL-1
  605.     GO TO 350
  606. C
  607. C
  608. C IF NO ITERATION, SET ITCNTV TO ZERO BECAUSE NOT ZEROED BY EXIT
  609. C ROUTINES
  610. 200    ITCNTV(LEVEL)=0
  611. 300    CONTINUE
  612.     NBLINE(J+1)=0
  613. C    OPEN(UNIT=LEVEL,NAME=NBLINE)
  614. C    CALL RASSIG (LEVEL,NBLINE,J)
  615.     CALL RASSIG (LEVEL,NBLINE)
  616. 350    RETURN
  617. C
  618. C *** ERROR PROCESSING ***
  619. C
  620. C  TOO MANY LEVELS
  621. 1000    I=2
  622. 1010    CALL ERRMSG(I)
  623. 1020    RETCD=2
  624.     RETURN
  625. C
  626. C
  627. C UNIDENTIFIED COMMAND (ARGUMENT)
  628. 1050    I=3
  629.     GO TO 1010
  630.     END
  631. c -h- bascng.for    Fri Aug 22 12:57:23 1986    
  632.     SUBROUTINE BASCNG(RETCD)
  633. C COPYRIGHT (C) 1983 GLENN EVERHART
  634. C ALL RIGHTS RESERVED
  635. C 60=MAX REAL ROWS
  636. C 301=MAX REAL COLS
  637. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  638. C VBLS AND TYPE DIMENSIONED 60,301
  639. C
  640. C SUBROUTINE BASCNG IS CALLED WHEN THE *B CALC COMMAND IS
  641. C ENCOUNTERED. THIS COMMAND INDICATES THAT THE DEFAULT BASE
  642. C FOR CONSTANTS IS TO BE CHANGED. THE ROUTINE READS IN ONE
  643. C OR TWO DIGITS AND CHANGES THE DEFAULT BASE SPECIFICATION
  644. C AS IS APPROPRIATE.
  645. C
  646. C MODIFICATION CLASS M2
  647. C
  648. C   BASCNG CALLS
  649. C
  650. C  ERRMSG  (PRINTS ERROR MESSAGES)
  651. C  GETNNB  (GETS THE NEXT NON-BLANK IN INPUT LINE LINE(80))
  652. C
  653. C
  654. C  BASCNG IS CALLED BY ROUTINE CMND WHICH IDENTIFIES THE COMMAND THAT
  655. C  THE USER WANTS TO EXECUTE.
  656. C
  657. C
  658. C    VARIABLE       USE
  659. C
  660. C    BASED       HOLDS THE DEFAULT BASE.
  661. C    IPT         POINTS TO THE NEXT NON-BLANK IN LINE(80).
  662. C    I1          BINARY VALUE OF FIRST DIGIT, VALUE OF NEW BASE.
  663. C    I2          BINARY VALUE OF SECOND DIGIT.
  664. C    NONBLK      POINTS TO THE LAST NON-BLANK IN LINE(80)
  665. C    RETCD       RETURN CODE: 1=O.K.  2=ERROR.
  666. C    RETCD2      HOLDS RETURN CODE FROM CALL TO GETNNB
  667. C
  668. C
  669. C
  670. C
  671. C    SUBROUTINE BASCNG(RETCD)
  672. C
  673. C
  674. C UPON ENTRANCE, NONBLK POINTS TO THE 'B' IN '*B' IN LINE
  675. C
  676.     InTeGer*4 IPT,I1,I2
  677.     InTeGer*4 LEVEL,NONBLK,LEND
  678.     InTeGer*4 RETCD,RETCD2,VIEWSW,BASED
  679. C
  680.     CHARACTER*1 DIGITS(16,3),LINE(80)
  681. C
  682.     COMMON /DIGV/ DIGITS
  683.     COMMON LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  684. C
  685. C
  686. C IF NO ARGUMENT, RETURN WITH NORMAL RETURN CODE. THIS ALLOWS THE
  687. C USER TO SEE WHAT THE PRESENT DEFAULT BASE IS.
  688.     RETCD=1
  689.     CALL GETNNB(IPT,RETCD2)
  690.     IF(RETCD2.GT.1)GO TO 1000
  691. C
  692. C
  693. C CHECK OUT FIRST DIGIT
  694.     DO 300 I1=1,10
  695.     IF(DIGITS(I1,1).EQ.LINE(IPT)) GO TO 400
  696. 300    CONTINUE
  697.     GO TO 999
  698. C
  699. C
  700. C SEE IF THERE IS A SECOND DIGIT
  701. 400    NONBLK=IPT
  702.     IF(I1.EQ.10)I1=0
  703.     CALL GETNNB(IPT,RETCD2)
  704.     IF(RETCD2.EQ.1)GO TO 500
  705. C
  706. C
  707. C IF NOT, CONVERT TO A TWO DIGIT NUMBER WITH A LEADING ZERO.
  708.     I2=I1
  709.     I1=0
  710.     GO TO 700
  711. C
  712. C A SECOND CHARACTER WAS FOUND; FIGURE OUT WHAT THE BINARY
  713. C VALUE IS (IF IT IS A DIGIT AT ALL).
  714. 500    DO 600 I2=1,10
  715.     IF(DIGITS(I2,1).EQ.LINE(IPT))GO TO 700
  716. 600    CONTINUE
  717.     GO TO 999
  718. C
  719. C CONVERT DIGITS TO A NUMBER IF IT IS LEGAL
  720. 700    IF(I2.EQ.10)I2=0
  721.     I1=I1*10+I2
  722.     IF(I1.NE.8.AND.I1.NE.10.AND.I1.NE.16) GO TO 999
  723.     BASED=I1
  724.     GO TO 1000
  725. C
  726. C
  727. C ILLEGAL BASE SPECIFICATION
  728. 999    RETCD=2
  729.     call vwrt(' Illegal Base. (Only 8,10, and 16 OK). Ignored.',
  730.      1  48)
  731. c    WRITE(11,998)
  732. c998    FORMAT(' Illegal Base. (Only 8,10,and 16 OK). Ignored.')
  733. C    CALL ERRMSG(19)
  734. C
  735. C RETURN
  736. 1000    RETURN
  737.     END
  738. c -h- blkdat.for    Fri Aug 22 12:57:49 1986    
  739.     BLOCK DATA
  740. C COPYRIGHT 1983 GLENN C.EVERHART
  741. C ALL RIGHTS RESERVED
  742.     Include AParms.inc
  743. C    InTeGer*4 MFID(2),MFMOD(2)
  744.     InTeGer*2 IFID(8,MFrm)
  745.     COMMON/IFIDC/IFID
  746.     CHARACTER*1 LFID(16,MFrm)
  747.     EQUIVALENCE(IFID(1,1),LFID(1,1))
  748. C    COMMON/FRM/MFID,MFMOD
  749.     CHARACTER*1 DTBL1(9,9,8)
  750. C BIG WASTEFUL TABLE TO INIT OPERATION TYPE DATA. TRY TO REUSE SPACE.
  751.     InTeGer*2 BTBL(6,6,8)
  752. C REUSE SPACE BY MAKING LFID AND IT OVERLAY EACH OTHER.
  753. C NO NEED TO WASTE IT.
  754. c    INTEGER DTBLIN
  755. C DTBLIN FLAGS THAT DTBL1 WAS ALREADY INITED, SO ONLY DOES SO ONCE.
  756.     EQUIVALENCE(LFID(1,1),BTBL(1,1,1))
  757.     InTeGer*2 BTBL1(6,6)
  758.     InTeGer*2 BTBL2(6,6),BTBL3(6,6),BTBL4(6,6),BTBL5(6,6)
  759.     InTeGer*2 BTBL6(6,6),BTBL7(6,6),BTBL8(6,6)
  760.     EQUIVALENCE(BTBL(1,1,1),BTBL1(1,1)),(BTBL(1,1,2),BTBL2(1,1))
  761.     EQUIVALENCE(BTBL(1,1,3),BTBL3(1,1)),(BTBL(1,1,4),BTBL4(1,1))
  762.     EQUIVALENCE(BTBL(1,1,5),BTBL5(1,1)),(BTBL(1,1,6),BTBL6(1,1))
  763.     EQUIVALENCE(BTBL(1,1,7),BTBL7(1,1)),(BTBL(1,1,8),BTBL8(1,1))
  764.     COMMON /DECIDE/ DTBL1
  765. cc    DATA DTBLIN/0/
  766.     DATA BTBL1 /4,2,3,4,8,9,
  767.      1  6*0,0,2,0,0,0,9,0,2,0,0,0,9,
  768.      2  0,2,3,0,0,9,0,2,4*0/
  769.     DATA BTBL2/
  770.      3  4,5*0,2,0,3*2,0,3,3*0,2*0,4,3*0,2*0,
  771.      4  8,5*0,9,0,3*9,0/
  772.     DATA BTBL3/4,2,3,4,8,9,
  773.      5  6*2,3,2,3,3,3,9,4,2,3,4,4,9,
  774.      6  8,2,3,4,8,9,9,2,4*9/
  775.     DATA BTBL4/
  776.      7  4,2,3,4,8,9,6*2,3,2,3,3,3,9,4,2,3,4,4,9,
  777.      8  8,2,3,4,8,9,
  778.      9  9,2,4*9/
  779.     DATA BTBL5/4,2,3,3*4,6*0,6*0,6*0,
  780.      1  6*0,6*0/
  781.     DATA BTBL6/4,3*0,4,0,4,3*0,0,0,4,3*0,2*0,4,3*0,2*0,
  782.      2  4,3*0,2*0,
  783.      3  4,3*0,2*0/
  784.         DATA BTBL7/4,2,3,3*4,6*2,6*3,6*4,
  785.      4  6*8,6*9/
  786.     DATA BTBL8/4,1,4,4,4,3,2,1,2,2,2,1,4,3,4,4,
  787.      5  4,3,4,3,4,4,4,3,4,3,4,4,
  788.      6  4,3,2,1,2,2,2,1/
  789.     END
  790. c -h- ca2e.for    Fri Aug 22 13:00:17 1986    
  791.     SUBROUTINE CA2E(LNIN,LNOUT)
  792. C CONVERT NORMAL ASCII FORM TO ENCODED
  793.     INCLUDE APARMS.INC
  794.     CHARACTER*1 NAME(4),NUMBER(6)
  795.     CHARACTER*1 LNIN,LNOUT
  796.     CHARACTER*6 NUMBR6
  797.     EQUIVALENCE(NUMBR6(1:1),NUMBER(1))
  798.     DIMENSION LNIN(128),LNOUT(128)
  799.     InTeGer*4 RRWACT,RCLACT
  800. C    COMMON/RCLACT/RRWACT,RCLACT
  801.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  802.      1  IDOL7,IDOL8
  803. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  804. C     1  IDOL7,IDOL8
  805.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  806. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  807.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  808. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  809. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  810. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  811.     InTeGer*4 KLVL
  812. C    COMMON/KLVL/KLVL
  813.     InTeGer*4 IOLVL,IGOLD
  814. C    COMMON/IOLVL/IOLVL
  815. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  816. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  817.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  818.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  819.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  820.      3  k3dfg,kcdelt,krdelt,kpag
  821. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  822. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  823. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  824. CCC    InTeGer*4 IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  825. CCC    COMMON/DOLLR/IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  826. C    LOGICAL*2 L63,L192,L255,L128
  827.     LOGICAL*4 L1,L2
  828. C    InTeGer*4 I63,I192,I255,I128
  829.     InTeGer*4 I63,I192,I127
  830.     InTeGer*4 I1,I2
  831. C    EQUIVALENCE(L128,I128)
  832. C    EQUIVALENCE(I63,L63),(I192,L192),(I255,L255)
  833.     EQUIVALENCE (I1,L1),(I2,L2)
  834. C    DATA I63/63/,I192/192/,I255/255/,I128/128/
  835.     DATA I63/63/,I192/192/,I127/127/
  836.     LI=1
  837.     LO=1
  838. C LI = INPUT LOCATION
  839. C LO=OUTPUT LOCATION
  840. 100    CONTINUE
  841.     LCC=ICHAR(LNIN(LI))
  842.     IF(LCC.EQ.255)GOTO 500
  843. C IF BINARY FORM, COPY 3 BYTES TO AVOID ERRORS.
  844. D    If(K3dfg.gt.0)goto 200
  845.     IF(LCC.LT.65.OR.LCC.GT.89)GOTO 200
  846. C WE MUST ENSURE VARSCN ALWAYS SEES AN ALPHA AT START.
  847.     IL1=LI
  848.     LE=110
  849.     LSTC=LE
  850.     CALL VARSCN(LNIN,IL1,LE,LSTC,ID1,ID2,IVLD)
  851. C AVOID MESSING UP FUNCTION NAMES
  852.     IF(ID2.EQ.1)IVLD=0
  853.     IF(IDOL1.NE.0.OR.IDOL2.NE.0)IVLD=0
  854. C ONLY REPACK NORMAL FORM NAMES
  855. C NOTE THAT SINCE THESE HAVE $ AFTER THE FIELDS, NO PARTIAL NAME
  856. C WILL EVER GET RECOGNIZED WITHOUT IDOL1 OR IDOL2 GETTING SET.
  857.     IF(IVLD.EQ.0)GOTO 200
  858. C ALIASED NAMES MIGHT GET SCANNED WITHIN PRIME AREA IF THE FIRST
  859. C ONE OR TWO CHARS GET STRIPPED OFF, SO TREAT LIKE P## OR D## FORMS
  860. C AND COPY THE WHOLE NAME HERE.
  861. C NOTE: WE LEAVE THE LIMITS HERE AT 60 AND 301 EVEN IF THE
  862. C SHEET DIMENSIONS CHANGE. THE ENCODING SCHEME BREAKS
  863. C DOWN OVER 63 BY 255 ANYWAY, SO JUST LEAVE LARGER NAMES
  864. C ALONE.
  865.     If(Kpag.gt.0)goto 250
  866.     If(K3DFG.GT.0)GOTO 250
  867. C Don't encode variables if using 3D addressing since this
  868. C could force the 3D addressing information to be lost.
  869.     IF(ID1.GT.60.OR.ID2.GT.301)GOTO 250
  870. C ALSO DON'T PACK ALIASED NAMES; THEY WON'T FIT IN CODED VALUES.
  871. C FOUND VARIABLE.
  872. C FIRST DON'T PACK P## AND D## FORMS.
  873.     IF(LNIN(LI+1).EQ.'#')GOTO 250
  874. C REPACK NORMAL VARIABLE HERE.
  875.     LI=LSTC
  876.     LNOUT(LO)=CHAR(255)
  877.     I1=IMASK(ID1,I63)
  878. C    I1=ID1
  879. C    L1=L1.AND.L63
  880.     I2=ID2/2
  881.     I2=IMASK(I2,I192)
  882. C    L2=L2.AND.L192
  883. C    L1=L1.OR.L2
  884.     I1=I1+I2
  885.     LNOUT(LO+1)=CHAR(I1)
  886. C    I2=ID2
  887.     I2=IMASK(ID2,I127)+128
  888. C    L2=L2.AND.L255
  889. C    L2=L2.OR.L128
  890.     LNOUT(LO+2)=CHAR(I2)
  891.     LO=MIN0(109,LO+3)    
  892.     GOTO 300
  893. 250    CONTINUE
  894. C JUST COPY DISPLAY FORMS.
  895.     IL1=LSTC-1
  896.     DO 251 N=LI,IL1
  897.     LNOUT(LO)=LNIN(N)
  898.     LO=LO+1
  899.     IF(LO.GT.110)GOTO 300
  900. 251    CONTINUE
  901.     LI=LSTC
  902. C THIS SKIPS OVER THE VARIABLE FOUND, SO WE GO ON.
  903.     GOTO 300
  904. 200    CONTINUE
  905. C HERE CHECK FOR FORMULA...
  906. C NOTE THAT SOME NAMES (E.G. "AVG" COULD CONFLICT WITH VERY LARGE COLUMN
  907. C NAMES. HOWEVER, IGNORE THAT POSSIBILITY. THAT'S AWFULLY FAR OUT.
  908.     CALL FNAME(LNIN(LI),II,INDX)
  909.     IF(INDX.LE.0.OR.INDX.GT.25)GOTO 220
  910. C Ensure that functions with indices too large to encode are
  911. C just treated literally. 229+25=254, the largest index we can have
  912. C before colliding with the 255 used to encode variable names.
  913. C thus all function names past the 25th must just be literally
  914. C entered. This is not really a problem as logic to find them
  915. C will work in either encoded or unencoded cases.
  916. C BE SURE A [ CHAR FOLLOWS NAME FOR THIS TO BE ACCEPTED...
  917.     IF(LNIN(LI+3).NE.'[')GOTO 220
  918. C FOUND MULTI-INPUT FUNCT NAME
  919.     LNOUT(LO)=CHAR(229+INDX)
  920. C SIMPLE 1-BYTE ENCODE OF NEEDED FUNCT NAME. NOT IN ANY CRITICAL RANGES...
  921.     LO=LO+1
  922.     LI=LI+3
  923.     GOTO 300
  924. 220    CONTINUE
  925.     LNOUT(LO)=LNIN(LI)
  926. C JUST COPY MISC. CHARACTER.
  927.     LO=LO+1
  928.     LI=LI+1
  929. 300    IF(LO.LT.109.AND.LI.LT.109)GOTO 100
  930. C THIS LOOPS EITHER COPYING LINE OR FINDING VARIABLES TILL DONE.
  931.     LO=MIN0(LO,110)
  932.     DO 400 N=LO,110
  933. 400    LNOUT(N)=0
  934. C COPY REST OF 128 BYTE ARRAY
  935.     DO 1 N=111,128
  936. 1    LNOUT(N)=LNIN(N)
  937. C DEFAULT ALL OF FORM LINES EXCEPT FORMULA IDENTICAL TO THE INPUT.
  938.     RETURN
  939. 500    CONTINUE
  940. C SPECIAL COPY OF 3 BYTE PACKED FORMS FOR SPEED
  941.     LNOUT(LO)=LNIN(LI)
  942.     LNOUT(LO+1)=LNIN(LI+1)
  943.     LNOUT(LO+2)=LNIN(LI+2)
  944.     LO=LO+3
  945.     LI=LI+3
  946.     GOTO 300
  947.     END
  948. c -h- calbin.for    Fri Aug 22 13:00:17 1986    
  949.     SUBROUTINE CALBIN(RETCD)
  950. C COPYRIGHT (C) 1983,1984 GLENN EVERHART
  951. C ALL RIGHTS RESERVED
  952. C 60=MAX REAL ROWS
  953. C 301=MAX REAL COLS
  954. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  955. C VBLS AND TYPE DIMENSIONED 60,301
  956. C
  957. C *******************************************************
  958. C *                                                     *
  959. C *             SUBROUTINE  CALBIN                      *
  960. C *                                                     *
  961. C *******************************************************
  962. C
  963. C  SUBROUTINE CALBIN PERFORMS A BINARY OPERATION ON TWO CONSTANTS.
  964. C
  965. C special version with multiple precision diked out - gce (to save space
  966. C on 256K PC)
  967. C  UPON ENTRANCE TO ROUTINE:
  968. C    OPERAND1 IS IN STACK1  (ST1PT-1)
  969. C    OPERAND2 IS ON TOP OF STACK2  (ST2PT-1)
  970. C    OPERATOR IS BELOW OPERAND2  (ST2PT-2)
  971. C  UPON EXIT:
  972. C    RESULT IS IN STACK1
  973. C    STACK2 HAS BEEN CLEANED UP
  974. C
  975. C  RETURN CODE    MEANING
  976. C    1    NORMAL RETURN
  977. C    2    OPERATION COMPLETE (RESULT HAS BEEN OUTPUT)
  978. C    3    ERROR RETURN
  979. C
  980. C
  981. C
  982. C  MODIFICATION CLASSES: M3, M4, AND M8
  983. C
  984. C
  985. C
  986. C  CALBIN CALLS
  987. C
  988. C  CONTYP   CONVERTS CONSTANTS TO DIFFERENT DATA TYPES
  989. C  ERRMSG   PRINTS OUT ERROR MESSAGES
  990. C  MULADD   PERFORMS MULTIPLE PRECISION ADDITION
  991. C  MULDIV   PERFORMS MULTIPLE PRECISION DIVISION
  992. C  MULMUL   PERFORMS MULTIPLE PRECISION MULTIPLICATION
  993. C
  994. C
  995. C
  996. C CALBIN IS CALLED BY POSTVL WHICH EVALUATES A POSTFIX EXPRESSION
  997. C
  998. C
  999. C
  1000. C
  1001. C   VARIABLE     USE
  1002. C
  1003. C  EIGHT(8)      PICKS OUT A REAL CONSTANT FROM STACK.
  1004. C  FOUR(4)       PICKS OUT AN INTEGER CONSTANT FROM STACK.
  1005. C  I,J           HOLD TEMPORARY VALUES.
  1006. C  IA            FIRST BYTE OF OPERAND 1. THIS HOLDS THE INDEX INTO
  1007. C                VBLS OF A VARIABLE IF THE OPERATOR IS AN = SIGN.
  1008. C  ID            USED TO CONVERT DECISION TABLE CHARACTER*1 VALUE TO
  1009. C                AN InTeGer*4 VALUE THAT CAN BE USED AS AN ARGUMENT
  1010. C                IN A CALL TO CONTYP.
  1011. C  INT,IHOLD     HOLD INTEGER*4 VALUES.
  1012. C  IOP           HOLDS THE BINARY OPERATOR.
  1013. C  IOP2          USED TO INDEX A COMPUTED GO.
  1014. C  ISW           HOLDS BASE FOR MULTIPLE PRECISION EXPONENTIATION
  1015. C  MINUS         VALUE IN THE 100TH BYTE OF A MULTIPLE PRECISION
  1016. C                NUMBER THAT IS USED TO INDICATE A NEGATIVE.
  1017. C  OP1TYP        TYPE OF OPERAND 1.
  1018. C  OP2TYP        TYPE OF OPERAND 2.
  1019. C  PLUS          VALUE IN THE 100TH BYTE OF A MULTIPLE PRECISION
  1020. C                NUMBER THAT IS USED TO INDICATE POSITIVE.
  1021. C  PT1,PT2       POINT TO ELEMENTS ON TOP OF STACKS 1 AND 2.
  1022. C  REAL,RHOLD    HOLD TEMPORARY REAL*8 VALUES.
  1023. C  RETCD         ERROR RETURN:  1 = O.K.   2 = RESULT WAS OUTPUT
  1024. C                3 = ERROR
  1025. C
  1026. C
  1027. C    SUBROUTINE CALBIN(RETCD)
  1028.     REAL*8 REAL,RHOLD,DFLOAT
  1029. C
  1030.     INTEGER*4 INT,IHOLD
  1031. C
  1032.     InTeGer*4 LEVEL,NONBLK,LEND
  1033.     InTeGer*4 VLEN(9)
  1034.     InTeGer*4 IOP,IA,ID,IOP2,ISW
  1035.     InTeGer*4 PLUS,MINUS
  1036.     InTeGer*4 OLDTYP,VIEWSW,BASED
  1037.     InTeGer*4 TYPE(1,1)
  1038.     InTeGer*4 RETCD,RETCD2
  1039.     InTeGer*4 OP1TYP,OP2TYP
  1040.     InTeGer*4 ST1PT,ST2PT,ST1TYP(40),ST2TYP(40),ST1LIM,ST2LIM
  1041.     InTeGer*4 PT1,PT2
  1042. C
  1043.     CHARACTER*1 STACK1(8,40),STACK2(8,40)
  1044.     InTeGer*4 STK12(2,40)
  1045.     REAL*8 XVBLK
  1046.     EQUIVALENCE(STK12(1,1),STACK1(1,1))
  1047.     CHARACTER*1 AVBLS(20,27), DTBL1(9,9,8)
  1048.     CHARACTER*1 VBLS(8,1,1)
  1049.     EQUIVALENCE (XVBLK,VBLS(1,1,1))
  1050.     CHARACTER*1 EIGHT(8),FOUR(4)
  1051.     CHARACTER*1 LINE(80)
  1052. C
  1053.     EQUIVALENCE (EIGHT,REAL), (FOUR,INT)
  1054. C
  1055.     COMMON LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  1056.     COMMON/V/ TYPE,AVBLS,VBLS,VLEN
  1057.     COMMON /STACK/STACK1,STACK2,ST1PT,ST2PT,ST1TYP,ST2TYP,
  1058.      ;         ST1LIM,ST2LIM
  1059.     COMMON /DECIDE/DTBL1
  1060. C
  1061. C
  1062.     DATA PLUS/0/,MINUS/1/
  1063. C
  1064. C
  1065.     RETCD=1
  1066.     PT1=ST1PT-1
  1067.     PT2=ST2PT-1
  1068. C
  1069.     IOP=ST2TYP(ST2PT-2)
  1070.     OP1TYP=ST1TYP(PT1)
  1071.     OP2TYP=ST2TYP(PT2)
  1072. C NOTE THAT IA IS UNUSED HERE... SAVE BIG DIMENSIONS
  1073.     IA=ICHAR(STACK1(1,PT1))
  1074.     ID1=STK12(1,PT1)
  1075.     ID2=STK12(2,PT1)
  1076. C    CALL GETDM(STACK1(1,PT1),ID1,ID2)
  1077. C ****&&&& ABOVE GETS LOCS IN 2 DIM ARRAY OF VARIABLES
  1078.     IF (IOP.NE.200) GOTO 100
  1079. C
  1080. C
  1081. C
  1082. C AN = SIGN IS THE OPERATOR. THIS IS A SPECIAL CASE.
  1083.     IF(OP1TYP.GE.0) GO TO 5
  1084. C
  1085. C
  1086. C
  1087. C VARIABLE TO THE LEFT OF = SIGN HAS A DATA TYPE BUT NO VALUE
  1088.     OP1TYP=-OP1TYP
  1089.     ST1TYP(PT1)=OP1TYP
  1090. C
  1091. C
  1092. C
  1093. C OPERAND 2 COPIED INTO OLD OPERAND'S POSITION IN CASE MORE
  1094. C THAN 1 = SIGN IS PRESENT FOR EXPRESSIONS LIKE  I=J=2
  1095. 5    J=VLEN(OP2TYP)
  1096. C    TYPE(IA)=OP1TYP
  1097.     CALL TYPSET(ID1,ID2,OP1TYP)
  1098. C    TYPE(ID1,ID2)=OP1TYP
  1099. C *&*****&&&&& NOTE TYPE ARRAY AND VBLS ARRAY NOW ARE HUGE
  1100. C  NOTE FURTHER THAT AVBLS IS OLD VBLS ARRAY. SWITCHED ON IF
  1101. C ID1 =< 27 AND ID2=1.
  1102.     DO 10 I=1,J
  1103. 10    STACK1(I,PT1)=STACK2(I,PT2)
  1104.     CALL CONTYP (STACK1,PT1,OP2TYP,OP1TYP,RETCD2)
  1105.     GOTO (20,9999), RETCD2
  1106.     STOP 20
  1107. C
  1108. C
  1109. C THE SPECIFIED VARIABLE GETS NEW VALUE.
  1110. C ***&&&& HERE'S WHERE WE STORE A VALUE INTO A VARIABLE...
  1111. 20    J=VLEN(OP1TYP)
  1112.     DO 30 I=1,J
  1113. C    VBLS(I,IA)=STACK1(I,PT1)
  1114.     IF(ID1.LE.27.AND.ID2.EQ.1) GOTO 22
  1115. C REPLACE VBLSET CALL WITH XVBLST CALL ON LAST PASS TO AVOID
  1116. C MULTIPLE REPLACEMENT OF STORAGE FOR EVERY PASS.
  1117.     VBLS(I,1,1)=STACK1(I,PT1)
  1118.     IF(I.EQ.J)CALL XVBLST(ID1,ID2,XVBLK)
  1119. C    CALL VBLSET(I,ID1,ID2,STACK1(I,PT1))
  1120. C    VBLS(I,ID1,ID2)=STACK1(I,PT1)
  1121.     GOTO 30
  1122. 22    AVBLS(I,ID1)=STACK1(I,PT1)
  1123. C *****&&&&&
  1124. 30    CONTINUE
  1125.     GOTO 10000
  1126. C
  1127. C
  1128. C  IOP2 VALUES 1="**"  2="*"   3="/"   4="+"   5="-"
  1129. 100    IOP2=IOP-111
  1130.     GOTO (1000,2000,2000,2000,2000),IOP2
  1131. C
  1132. C
  1133. C    ********************************************
  1134. C    ***********  EXPONENTIATION  ***************
  1135. C    ********************************************
  1136. C
  1137. C
  1138. C  FIRST CONVERT TO PROPER TYPE
  1139. 1000    ID=ICHAR(DTBL1(OP2TYP,OP1TYP,5))
  1140.     CALL CONTYP(STACK1,PT1,OP1TYP,ID,RETCD2)
  1141.     IF (RETCD2.EQ.2) GOTO 9999
  1142.     ID=ICHAR(DTBL1(OP2TYP,OP1TYP,6))
  1143.     CALL CONTYP (STACK2,PT2,OP2TYP,ID,RETCD2)
  1144.     IF (RETCD2.EQ.2) GOTO 9999
  1145. C
  1146. C
  1147. C  GOTO APPROPRIATE PLACE TO PERFORM OPERATION
  1148.     ID=ICHAR(DTBL1(OP2TYP,OP1TYP,8))
  1149.     GOTO (1100,1200,1300,1400,1500,1600,1700),ID
  1150.     STOP 1000
  1151. C
  1152. C
  1153. C  REAL**REAL
  1154. 1100    DO 1104 I=1,8
  1155. 1104    EIGHT(I)=STACK1(I,PT1)
  1156.     RHOLD=REAL
  1157.     DO 1108 I=1,8
  1158. 1108    EIGHT(I)=STACK2(I,PT2)
  1159.     REAL=RHOLD**REAL
  1160. C
  1161. C
  1162. C  USED BY REAL**I
  1163. 1109    DO 1110 I=1,8
  1164. 1110    STACK1(I,PT1)=EIGHT(I)
  1165. C
  1166. C
  1167. C  USED BY I**REAL,I**I
  1168. 1114    ST1TYP(PT1)=ICHAR(DTBL1(OP2TYP,OP1TYP,7))
  1169.     GOTO 10000
  1170. C
  1171. C
  1172. C
  1173. C  REAL**I
  1174. 1200    DO 1204 I=1,8
  1175. 1204    EIGHT(I)=STACK1(I,PT1)
  1176.     DO 1208 I=1,4
  1177. 1208    FOUR(I)=STACK2(I,PT2)
  1178.     REAL=REAL**INT
  1179.     GOTO 1109
  1180. C
  1181. C
  1182. C
  1183. C  I**REAL (PARTS USED BY I**I)
  1184. 1300    DO 1304 I=1,4
  1185. 1304    FOUR(I)=STACK1(I,PT1)
  1186.     DO 1308 I=1,8
  1187. 1308    EIGHT(I)=STACK2(I,PT2)
  1188. C
  1189. C DIFFERENT VERSIONS OF FORTRAN TREAT THE RESULT IN DIFFERENT WAYS.
  1190. C IF YOU WANT THE RESULT TO BE REAL, YOU MUST ALSO CHANGE DTBL1.
  1191. C
  1192.     INT=DFLOAT(INT)**REAL
  1193. 1310    DO 1314 I=1,4
  1194. 1314    STACK1(I,PT1)=FOUR(I)
  1195.     GOTO 1114
  1196. C
  1197. C
  1198. C
  1199. C  I**I
  1200. 1400    DO 1404 I=1,4
  1201. 1404    FOUR(I)=STACK1(I,PT1)
  1202.     IHOLD=INT
  1203.     DO 1408 I=1,4
  1204. 1408    FOUR(I)=STACK2(I,PT2)
  1205.     INT=IHOLD**INT
  1206.     GOTO 1310
  1207. C
  1208. C
  1209. C
  1210. C  M8**I    (PARTS USED BY M10**I, M16**I)
  1211. 1500    ISW=8
  1212. 1501    IF(ST2PT.LE.ST2LIM)GO TO 1502
  1213. C
  1214. C
  1215. C STACK OVERFLOW
  1216.     CALL ERRMSG(9)
  1217.     GO TO 9999
  1218. C
  1219. C
  1220. C GET EXPONENT AS AN INTEGER
  1221. 1502    DO 1504 I=1,4
  1222. 1504    FOUR(I)=STACK2(I,PT2)
  1223.     IF (INT.GE.0) GOTO 1520
  1224. C
  1225. C
  1226. C EXPONENT NOT POSITIVE OR 0
  1227.     CALL ERRMSG (15)
  1228.     GOTO 9999
  1229. 1520    IF (INT.GT.0) GOTO 1530
  1230. C
  1231. C
  1232. C I**0 = 1
  1233.     STACK1(8,PT1)=PLUS
  1234.     DO 1522 I=2,7
  1235. 1522    STACK1(I,PT1)=0
  1236. C LEAVE AS INTEGER SETS HERE RATHER THAN EXPLICIT CHAR() CALLS
  1237.     STACK1(1,PT1)=1
  1238.     GOTO 10000
  1239. C
  1240. C
  1241. C EXPONENT IS > 0
  1242. 1530    INT=INT-1
  1243. C
  1244. C
  1245. C IF EXPONENT = 1 WE ARE DONE
  1246.     IF(INT.EQ.0)GO TO 10000
  1247. C
  1248. C
  1249. C EXPONENT IS > 1. COPY TO STACK 2 WHERE MULMUL EXPECTS THE OTHER
  1250. C FACTOR.
  1251.     DO 1534 I=1,8
  1252. 1534    STACK2(I,ST2PT)=STACK1(I,PT1)
  1253.     ST2TYP(ST2PT)=ST1TYP(PT1)
  1254. C
  1255. C
  1256. C
  1257. C
  1258. 1549    continue
  1259. c1549    DO 1550 I=1,INT
  1260. c    CALL MULMUL(PT1,ST2PT,RETCD2,ISW)
  1261. c    IF(RETCD2.GE.2)GO TO 9999
  1262. c1550    CONTINUE
  1263.     GOTO 10000
  1264. C
  1265. C  M10**I
  1266. 1600    ISW=10
  1267.     GOTO 1501
  1268. C
  1269. C
  1270. C
  1271. C  M16**I
  1272. 1700    ISW=16
  1273.     GOTO 1501
  1274. C
  1275. C
  1276. C  *****************************************
  1277. C  * MAKE CONVERSIONS APPROPRIATE FOR */+- *
  1278. C  *****************************************
  1279. 2000    CONTINUE
  1280.     ID=ICHAR(DTBL1(OP2TYP,OP1TYP,1))
  1281.     CALL CONTYP (STACK1,PT1,OP1TYP,ID,RETCD2)
  1282.     IF (RETCD2.EQ.2) GOTO 9999
  1283.     IF(ID.EQ.0)GO TO 2010
  1284.     ST1TYP(PT1)=ID
  1285.     OP1TYP=ID
  1286. 2010    ID=ICHAR(DTBL1(OP2TYP,OP1TYP,2))
  1287.     CALL CONTYP (STACK2,PT2,OP2TYP,ID,RETCD2)
  1288.     IF (RETCD2.EQ.2) GOTO 9999
  1289.     IF(ID.EQ.0)GOTO 2020
  1290.     ST2TYP(PT2)=ID
  1291.     OP2TYP=ID
  1292. C
  1293. 2020    CONTINUE
  1294. C
  1295. C
  1296. C  GOTO SECTION ACCORDING TO OPERATION *=3000, /=4000,+=5000,-=6000
  1297.     GOTO (2100,3000,4000,5000,6000),IOP2
  1298. 2100    STOP 2100
  1299. C
  1300. C
  1301. C
  1302. C
  1303. C
  1304. C
  1305. C  **********************************************
  1306. C  ***********  MULTIPLICATION  *****************
  1307. C  **********************************************
  1308. 3000    ID=ICHAR(DTBL1(OP2TYP,OP1TYP,4))
  1309.     GOTO (3100,3200,3300,3300,3500,3600,3700,3300,3200),ID
  1310.     STOP 3000
  1311. C
  1312. C
  1313. C  ASCII (ALSO SUBTRACTION, MULTIPLICATION AND DIVISION)
  1314. 3100    CALL ERRMSG (12)
  1315.     GOTO 9999
  1316. C
  1317. C
  1318. C  DECIMAL, REAL
  1319. 3200    DO 3204 I=1,8
  1320. 3204    EIGHT(I)=STACK1(I,PT1)
  1321.     RHOLD=REAL
  1322.     DO 3208 I=1,8
  1323. 3208    EIGHT(I)=STACK2(I,PT2)
  1324.     REAL=RHOLD*REAL
  1325. 3209    DO 3210 I=1,8
  1326. 3210    STACK1(I,PT1)=EIGHT(I)
  1327. C
  1328. C
  1329. C  FOLLOWING USED BY OTHER SECTIONS
  1330. 3220    ST1TYP(PT1)=ICHAR(DTBL1(OP2TYP,OP1TYP,3))
  1331.     GOTO 10000
  1332. C
  1333. C
  1334. C
  1335. C  HEX,INTEGER,OCTAL
  1336. 3300    DO 3304 I=1,4
  1337. 3304    FOUR(I)=STACK1(I,PT1)
  1338.     IHOLD=INT
  1339.     DO 3308 I=1,4
  1340. 3308    FOUR(I)=STACK2(I,PT2)
  1341.     INT=IHOLD*INT
  1342. 3309    DO 3310 I=1,4
  1343. 3310    STACK1(I,PT1)=FOUR(I)
  1344.     GOTO 3220
  1345. C
  1346. C
  1347. C
  1348. C  M10
  1349. 3500    continue
  1350. c3500    CALL MULMUL (PT1,PT2,RETCD2,10)
  1351. C
  1352. C
  1353. C  FOLLOWING USED BY OTHER SECTIONS
  1354. 3510    IF (RETCD2.EQ.2) GOTO 9999
  1355.     GOTO 3220
  1356. C
  1357. C
  1358. C
  1359. C  M8
  1360. 3600    continue
  1361. c3600    CALL MULMUL (PT1,PT2,RETCD2,8)
  1362.     GOTO 3510
  1363. C
  1364. C
  1365. C
  1366. C  M16
  1367. 3700    continue
  1368. c3700    CALL MULMUL (PT1,PT2,RETCD2,16)
  1369.     GOTO 3510
  1370. C
  1371. C
  1372. C  **************************************************
  1373. C  ******************  DIVISION  ********************
  1374. C  **************************************************
  1375. 4000    ID=ICHAR(DTBL1(OP2TYP,OP1TYP,4))
  1376.     GOTO (3100,4200,4300,4300,4500,4600,4700,4300,4200),ID
  1377.     STOP 4000
  1378. C
  1379. C
  1380. C  DECIMAL,REAL
  1381. 4200    DO 4204 I=1,8
  1382. 4204    EIGHT(I)=STACK1(I,PT1)
  1383.     RHOLD=REAL
  1384.     DO 4208 I=1,8
  1385. 4208    EIGHT(I)=STACK2(I,PT2)
  1386.     IF(REAL.NE.0.D0)GO TO 4210
  1387.     CALL ERRMSG(23)
  1388.     GO TO 9999
  1389. 4210    REAL=RHOLD/REAL
  1390.     GOTO 3209
  1391. C
  1392. C
  1393. C  HEX,INTEGER,OCTAL
  1394. 4300    DO 4304 I=1,4
  1395. 4304    FOUR(I)=STACK1(I,PT1)
  1396.     IHOLD=INT
  1397.     DO 4308 I=1,4
  1398. 4308    FOUR(I)=STACK2(I,PT2)
  1399.     IF(INT.NE.0)GO TO 4310
  1400.     CALL ERRMSG(23)
  1401.     GO TO 9999
  1402. 4310    INT=IHOLD/INT
  1403.     GOTO 3309
  1404. C
  1405. C
  1406. C  M10
  1407. 4500    continue
  1408. c4500    CALL MULDIV (PT1,PT2,RETCD2,10)
  1409.     GOTO 3510
  1410. C
  1411. C
  1412. C  M8
  1413. 4600    continue
  1414. c4600    CALL MULDIV (PT1,PT2,RETCD2,8)
  1415.     GOTO 3510
  1416. C
  1417. C
  1418. C  M16
  1419. 4700    continue
  1420. c4700    CALL MULDIV (PT1,PT2,RETCD2,16)
  1421.     GOTO 3510
  1422. C
  1423. C
  1424. C
  1425. C
  1426. C
  1427. C **************************************************
  1428. C *****************  ADDITION  *********************
  1429. C **************************************************
  1430. C
  1431. 5000    ID=ICHAR(DTBL1(OP2TYP,OP1TYP,4))
  1432.     GOTO (3100,5200,5300,5300,5500,5600,5700,5300,5200),ID
  1433.     STOP 5000
  1434. C
  1435. C
  1436. C  DECIMAL, REAL
  1437. 5200    DO 5204 I=1,8
  1438. 5204    EIGHT(I)=STACK1(I,PT1)
  1439.     RHOLD=REAL
  1440.     DO 5208 I=1,8
  1441. 5208    EIGHT(I)=STACK2(I,PT2)
  1442.     REAL=RHOLD+REAL
  1443.     GOTO 3209
  1444. C
  1445. C
  1446. C  HEX,INTEGER,OCTAL
  1447. 5300    DO 5304 I=1,4
  1448. 5304    FOUR(I)=STACK1(I,PT1)
  1449.     IHOLD=INT
  1450.     DO 5308 I=1,4
  1451. 5308    FOUR(I)=STACK2(I,PT2)
  1452.     INT=IHOLD+INT
  1453.     GOTO 3309
  1454. C
  1455. C
  1456. C  M10
  1457. 5500    continue
  1458. c5500    CALL MULADD (PT1,PT2,RETCD2,1)
  1459.     GOTO 3510
  1460. C
  1461. C
  1462. C  M8
  1463. 5600    continue
  1464. c5600    CALL MULADD (PT1,PT2,RETCD2,2)
  1465.     GOTO 3510
  1466. C
  1467. C
  1468. C  M16
  1469. 5700    continue
  1470. c5700    CALL MULADD(PT1,PT2,RETCD2,3)
  1471.     GOTO 3510
  1472. C
  1473. C
  1474. C
  1475. C
  1476. C
  1477. C
  1478. C  ***************************************************
  1479. C  ******************  SUBTRACTION  ******************
  1480. C  ***************************************************
  1481. C
  1482. 6000    ID=ICHAR(DTBL1(OP2TYP,OP1TYP,4))
  1483.     GOTO (3100,6200,6300,6300,6500,6600,6700,6300,6200),ID
  1484.     STOP 6000
  1485. C
  1486. C
  1487. C  DECIMAL,REAL
  1488. 6200    DO 6204 I=1,8
  1489. 6204    EIGHT(I)=STACK1(I,PT1)
  1490.     RHOLD=REAL
  1491.     DO 6208 I=1,8
  1492. 6208    EIGHT(I)=STACK2(I,PT2)
  1493.     REAL=RHOLD-REAL
  1494.     GOTO 3209
  1495. C
  1496. C
  1497. C  HEX,INTEGER,OCTAL
  1498. 6300    DO 6304 I=1,4
  1499. 6304    FOUR(I)=STACK1(I,PT1)
  1500.     IHOLD=INT
  1501.     DO 6308 I=1,4
  1502. 6308    FOUR(I)=STACK2(I,PT2)
  1503.     INT=IHOLD-INT
  1504.     GOTO 3309
  1505. C
  1506. C
  1507. C  M10
  1508. 6500    continue
  1509. c6500    CALL MULADD (PT1,PT2,RETCD2,4)
  1510.     GOTO 3510
  1511. C
  1512. C
  1513. C  M8
  1514. 6600    continue
  1515. c6600    CALL MULADD (PT1,PT2,RETCD2,5)
  1516.     GOTO 3510
  1517. C
  1518. C
  1519. C  M16
  1520. 6700    continue
  1521. c6700    CALL MULADD (PT1,PT2,RETCD2,6)
  1522.     GOTO 3510
  1523. C
  1524. C
  1525. C
  1526. C
  1527. C
  1528. C    EXIT
  1529. 9999    RETCD=3
  1530. C
  1531. C
  1532. C
  1533. 10000    ST2PT=ST2PT-2
  1534.     RETURN
  1535.     END
  1536. c -h- calc.for    Fri Aug 22 13:00:17 1986    
  1537.     SUBROUTINE CALC
  1538. C COPYRIGHT (C) 1983 GLENN EVERHART
  1539. C ALL RIGHTS RESERVED
  1540. C 60=MAX REAL ROWS
  1541. C 301=MAX REAL COLS
  1542. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  1543. C VBLS AND TYPE DIMENSIONED 60,301
  1544. C ***               CALC   MAINLINE                   ***
  1545. C
  1546. C THIS PROGRAM EVALUATES ARITHMETIC EXPRESSIONS INPUT TO IT
  1547. C AND ALLOWS VARIABLES TO BE ASSIGNED VALUES. IT FEATURES
  1548. C MULTIPLE PRECISION ARITHMETIC IN BASE 10, OCTAL, AND
  1549. C HEXADECIMAL. SEE CALC.MEM FOR A COMPLETE DESCRIPTION IN
  1550. C THE FORM OF A USERS GUIDE. TYPE ? TO OBTAIN A LIST OF
  1551. C POSSIBLE COMMANDS.
  1552. C
  1553. C    CALC CALLS
  1554. C
  1555. C  ASSIGN    OPENS A FILE AND ASSIGNS IT TO A LOGICAL I/O UNIT.
  1556. C  CLOSE     CLOSES A FILE ASSOCIATED WITH A LOGICAL I/O UNIT.
  1557. C  CMND      DETERMINES WHAT CALC COMMAND IS REQUIRED.
  1558. C  ERRCX     CHECKS THE EXPRESSION IN AN INPUT LINE FOR SYNTAX ERRORS.
  1559. C  ERRMSG    PRINTS OUT ERROR MESSAGES.
  1560. C  EXIT      RETURNS TO OPERATING SYSTEM.
  1561. C  GETMCR    GETS THE COMMAND LINE USED TO INVOKE CALC. IF AN ARGUMENT
  1562. C            IS PRESENT, CALC EXITS AFTER THAT ONE COMMAND IS EXECUTED.
  1563. C  INPOST    CONVERTS AN INFIX EXPRESSION TO POSTFIX FORM.
  1564. C  LIST      LISTS THE LEGAL CALC COMMANDS.
  1565. C  POSTVL    CONVERTS AN EXPRESSION IN POSTFIX NOTATION ON STACK 1 TO
  1566. C            A VALUE.
  1567. C  SLEND     FINDS THE LAST NON-BLANK IN LINE(80).
  1568. C  VAROUT    PRINTS OUT THE VALUE OF A VARIABLE.
  1569. C  ZNEG      DETERMINES IF A VARIABLE IS POSITIVE IN VALUE
  1570. C
  1571. C
  1572. C
  1573. C   VARIABLE      USE
  1574. C
  1575. C  BASED        DEFAULT BASE WHEN CONSTANTS ARE ENTERED.
  1576. C  BLANK        ' '
  1577. C  DIGITS(16,3) HOLDS DECIMAL, OCTAL, AND HEXADECIMAL DIGITS. THE
  1578. C               SECOND SUBSCRIPT IS
  1579. C                     1 FOR DECIMAL
  1580. C                     2 FOR OCTAL
  1581. C                     3 FOR HEXADECIMAL
  1582. C  I,J          HOLD TEMPORARY VALUES.
  1583. C  ITCNTV(6)    INDEXED BY LEVEL. 0 INDICATES THAT NO ITERATION ON THE
  1584. C               INDIRECT COMMAND FILE IS TO TAKE PLACE. IF POSITIVE, IT
  1585. C               HOLDS THE INDEX INTO VBLS AND REPRESENTS THE VARIABLE
  1586. C               USED TO CONTROL ITERATION.
  1587. C        THIS VARIABLE IS GUARANTEED TO BE 1-27.
  1588. C  LEND         POINTS TO LAST NON-BLANK CHARACTER IN LINE(80)
  1589. C  LEVEL        HOLDS THE LOGICAL I/O UNIT WHERE THE NEXT CALC COMMAND
  1590. C               LINES COME FROM.
  1591. C  LINE(80)     COMMAND INPUT LINE.
  1592. C  NONBLK       POINTS TO LAST NON-BLANK FOUND IN LINE(80).
  1593. C  ONCE         HOLDS 1 IF ONLY ONE COMMAND LINE IS TO BE EXECUTED,
  1594. C               0 OTHERWISE.
  1595. C  STAR         '*'
  1596. C  VIEWSW           VIEW SWITCH
  1597. C                    0 = OUTPUT ERROR MESSAGES
  1598. C                    1 = OUTPUT ERROR MESSAGES AND FILE COMMAND LINES
  1599. C                    2 = OUTPUT ERROR MESSAGES AND VALUE OF EXPRESSIONS
  1600. C                        EVALUATED.
  1601. C                    3 = OUTPUT EVERYTHING
  1602. C  WHAT         '?' SIGNIFIES THAT A LIST OF POSSIBLE COMMANDS
  1603. C               SHOULD BE OUTPUT.
  1604. C
  1605. C    MODIFIED    REASON
  1606. C
  1607. C    18-MAY-1981    DELETED LINE THAT CAUSED DEFAULT BASE TO BE RESET
  1608. C            WHEN AN ERROR OCCURS (PB)
  1609. C
  1610. C    18-MAY-1981    ADDED CODE AT LINES 106 TO 108 TO CONVERT FROM LOWER
  1611. C            TO UPPER CASE  (PB)
  1612. C
  1613. C CHANGED TO SUBROUTINE GCE TO ALLOW EXTERNAL CONTROL OF CALCULATOR.
  1614. C
  1615.     InTeGer*4 LEVEL,NONBLK,LEND
  1616.     InTeGer*4 RETCD,VIEWSW,BASED
  1617.     InTeGer*4 ONCE
  1618.     InTeGer*4 ZNEG,ITCNTV(6)
  1619. C
  1620.     CHARACTER*1  LINE(80),WHAT,STAR,QUOTE
  1621.     CHARACTER*1 ALPHA(27),COMMA,BLANK,RPAR,LPAR,EQ
  1622.     CHARACTER*1 DIGITS(16,3)
  1623.     CHARACTER*1 OARRY(100)
  1624.     InTeGer*4 OSWIT,OCNTR
  1625. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  1626. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  1627.     InTeGer*4 IPS1,IPS2,MODFLG
  1628. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  1629.        InTeGer*4 XTCFG,IPSET,XTNCNT
  1630.        CHARACTER*1 XTNCMD(80)
  1631. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  1632. C VARY FLAG ITERATION COUNT
  1633.     INTEGER KALKIT
  1634. C    COMMON/VARYIT/KALKIT
  1635.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  1636.     InTeGer*4 RCMODE,IRCE1,IRCE2
  1637. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  1638. C     1  IRCE2
  1639. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  1640. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  1641. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  1642. C RCFGX ON.
  1643. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  1644. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  1645. C  AND VM INHIBITS. (SETS TO 1).
  1646.     INTEGER*4 FH
  1647. C FILE HANDLE FOR CONSOLE I/O (RAW)
  1648. C    COMMON/CONSFH/FH
  1649.     CHARACTER*1 ARGSTR(52,4)
  1650. C    COMMON/ARGSTR/ARGSTR
  1651.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  1652.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  1653.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  1654.      3  IRCE2,FH,ARGSTR
  1655.     InTeGer*4 ILNFG,ILNCT
  1656.     CHARACTER*1 ILINE(106)
  1657.     COMMON/ILN/ILNFG,ILNCT,ILINE
  1658. C
  1659.     COMMON  LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  1660.     InTeGer*4 RRWACT,RCLACT
  1661. C    COMMON/RCLACT/RRWACT,RCLACT
  1662.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  1663.      1  IDOL7,IDOL8
  1664. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  1665. C     1  IDOL7,IDOL8
  1666.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  1667. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  1668.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  1669. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  1670. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  1671. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  1672.     InTeGer*4 KLVL
  1673. C    COMMON/KLVL/KLVL
  1674.     InTeGer*4 IOLVL,IGOLD
  1675. C    COMMON/IOLVL/IOLVL
  1676. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  1677. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  1678.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  1679.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  1680.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  1681.      3  k3dfg,kcdelt,krdelt,kpag
  1682. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  1683. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  1684. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  1685. C    COMMON/KLVL/KLVL
  1686.     COMMON  /CONS/ALPHA,COMMA,BLANK,RPAR,LPAR,EQ
  1687.     COMMON /DIGV/ DIGITS
  1688.     COMMON/ITERA/ITCNTV
  1689.     Character*2 crlf
  1690.     character*127 cwrk
  1691. C
  1692.     DATA  WHAT/'?'/, STAR/'*'/, QUOTE/''''/
  1693.     DATA ONCE/0/
  1694. C
  1695.     crlf(1:1)=char(13)
  1696.     crlf(2:2)=char(10)
  1697. C
  1698. C
  1699. C LOGICAL I/O UNIT 1 IS ASSIGNED TO THE INVOKING TERMINAL
  1700. C IF YOU DON'T WANT TO RISK THE BUILDER TASK BUILDING (LINKING)
  1701. C THE MODULES PROPERLY, PUT IN A
  1702.     IF(KLVL.EQ.1)LEVEL=KLVL
  1703.     ONCE=0
  1704. C    IF(ILNFG.NE.0) GOTO 6000
  1705. C    CALL ASSIGN (1,'TT:')
  1706. 6000    CONTINUE
  1707. C CHANGE TI: TO TT: FOR VMS.
  1708. C
  1709.     IF(ILNFG.EQ.0)GOTO 6010
  1710.     IF(ILNCT.GT.0)GOTO 6010
  1711. C INVALID INPUTS...NO LINE TO DO BUT FLAGGED TO DO. CLEAN UP.
  1712.     ILNFG=0
  1713.     RETURN
  1714. 6010    CONTINUE
  1715.     IF(ILNFG.NE.0.AND.ILNCT.GT.0)GOTO 6001
  1716. C ++++++
  1717. C FOR DEC FORTRAN:
  1718. C    CALL GETMCR(LINE,LEND)
  1719. C    IF(LEND)20,20,5
  1720. C FOR NON-DEC FORTRAN: (OR VAX VERSIONS)
  1721.     GOTO 20
  1722. C ++++++  END OF CHOICES...
  1723. 5    CONTINUE
  1724.     GOTO 6003
  1725. 6001    CONTINUE
  1726.     DO 6007 LENDX=1,80
  1727. 6007    LINE(LENDX)=CHAR(32)
  1728.     IF(ILNFG.EQ.1)ONCE=1
  1729.     I255X=0
  1730.     DO 6002 LENDX=1,ILNCT
  1731.     LINE(LENDX)=ILINE(LENDX)
  1732.     IF(ICHAR(LINE(LENDX)).EQ.255)I255X=3
  1733.     IF(I255X.LE.0)GOTO 4602
  1734.     I255X=I255X-1
  1735.     GOTO 6002
  1736. C SKIP ENTIRE 3-CHR PACKED CODES
  1737. 4602    CONTINUE
  1738.     IF(ICHAR(LINE(LENDX)).GT.0.AND.ICHAR(LINE(LENDX)).LT.32)
  1739.      1  LINE(LENDX)=CHAR(32)
  1740. C LEAVE ANY EXISTING NULLS IN.
  1741. 6002    CONTINUE
  1742.     LEND=ILNCT
  1743. CD    CALL FRMEDT(LINE,LEND)
  1744. C FRMEDT IMPLEMENTS EDITS OF {VAR INTO THAT VARIABLE'S FORMULA
  1745. CC NULL TERMINATE THE LINE TO ENSURE WE END SOMEWHERE.
  1746. C    ICCC=MIN0(80,(LEND+1))
  1747. C    LINE(ICCC)=0
  1748.     GOTO 103
  1749. 6003    CONTINUE
  1750.     DO 6 NONBLK=1,7
  1751.     IF(LINE(NONBLK).EQ.BLANK)GO TO 7
  1752.     IF(ICHAR(LINE(NONBLK)).EQ.13)GO TO 20
  1753. 6    CONTINUE
  1754.     STOP 6
  1755. 7    NONBLK=NONBLK+1
  1756.     ONCE=1
  1757.     GO TO 106
  1758. C
  1759. C  ERROR RESET
  1760.  
  1761. 10    IF(LEVEL.LE.1) GO TO 12
  1762.     CLOSE(LEVEL)
  1763.     LEVEL=LEVEL-1
  1764.     GO TO 10
  1765. 12    CONTINUE
  1766.     VIEWSW=3
  1767. C
  1768. C
  1769. C  GET NEXT INPUT LINE
  1770. 20    CONTINUE
  1771.     LINE(1)=0
  1772.     LINE(2)=0
  1773.     IF(ONCE.EQ.1.AND.LEVEL.LE.1) RETURN
  1774. C20    IF(ONCE.EQ.1.AND.LEVEL.EQ.1) CALL EXIT
  1775. C    IF (ILNFG.NE.0.AND.ILNCT.GT.0)GOTO 6004
  1776.     IF (LEVEL.LE.1.AND.ILNFG.NE.0.AND.ILNCT.GT.0)RETURN
  1777.     IF(LEVEL.LT.1)RETURN
  1778.     IF(ILNFG.EQ.0.AND.LEVEL.EQ.1)call vwrt(crlf,2)
  1779.     IF(ILNFG.EQ.0.AND.LEVEL.EQ.1)call vwrt('Calc>',5)
  1780. c22    FORMAT(' CALC>')
  1781. C
  1782. C
  1783.     LLLV=LEVEL
  1784.     IF(LLLV.EQ.1)LLLV=11
  1785. c    rewind 11
  1786.     if(lllv.ne.11)goto 6008
  1787.     call vget(line,80)
  1788.     do 6009 iii=1,80
  1789. C Force chars read in to spaces like Fortran system would.
  1790. C This includes controls like crlf.
  1791.     if(ichar(line(iii)).le.31)line(iii)=' '
  1792. 6009    Continue
  1793. 6008    Continue
  1794. c    if(lllv.eq.11)call vget(line,80)
  1795.     if(lllv.ne.11)READ (LLLV,24,END=900,ERR=1000) LINE
  1796. c    rewind 11
  1797. 24    FORMAT (80A1)
  1798. C    GOTO 6005
  1799. C SECTION BELOW COMMENTED OUT BECAUSE IT SHOULD NEVER BE CALLED (GCE).
  1800. C6004    CONTINUE
  1801. C    DO 6006 LENDX=1,80
  1802. C6006    LINE(LENDX)=CHAR(32)
  1803. CC ABOVE BLANKS OUT LINE ARRAY
  1804. C    DO 6007 LENDX=1,ILNCT
  1805. C6007    LINE(LENDX)=ILINE(LENDX)
  1806. CC ABOVE COPIES INPUT FROM OUR CALLER...
  1807. C6005    CONTINUE
  1808. C
  1809. C
  1810. C
  1811. C FIND LAST NONBLANK, SAVE POSITION WITH VARIABLE 'LEND'
  1812. CD    CALL FRMEDT(LINE,LEND)
  1813.     CALL SLEND(RETCD)
  1814.     GO TO(30,20),RETCD
  1815.     STOP 30
  1816. 30    CONTINUE
  1817. C
  1818. C
  1819.     IF(ILNFG.EQ.0.AND.ILNCT.GT.0)GOTO 103
  1820. C SHOW WHAT WAS READ FROM FILE
  1821. c    rewind 11
  1822.     cwrk=' '
  1823.     IF(LEVEL.NE.1.AND.(VIEWSW.EQ.1.OR.VIEWSW.EQ.3))
  1824.      1  write(cwrk,40)level,(line(i),i=1,lend)
  1825.     cwrk= crlf // cwrk
  1826.     iii=lend+10
  1827.     IF(LEVEL.NE.1.AND.(VIEWSW.EQ.1.OR.VIEWSW.EQ.3))
  1828.      1  call vwrt(cwrk,iii)
  1829. c     1 WRITE(11,40)LEVEL,(LINE(I),I=1,LEND)
  1830. c    rewind 11
  1831. 40    FORMAT (' CALC<',I1,'>',80A1)
  1832. 103    CONTINUE
  1833. C NULL TERMINATE THE LINE TO ENSURE WE END SOMEWHERE.
  1834.     ICCC=MIN0(80,(LEND+1))
  1835.     LINE(ICCC)=0
  1836. C
  1837. C  IDENTIFY FIRST NON-BLANK
  1838.     DO 104 NONBLK=1,LEND
  1839.     IF (LINE(NONBLK).NE.BLANK) GOTO 106
  1840. 104    CONTINUE
  1841.     RETURN
  1842. C    STOP 104
  1843. C
  1844. C CONVERT LOWER CASE TO UPPER CASE
  1845. 106    CONTINUE
  1846.     I255X=0
  1847.     DO 108 I=NONBLK,LEND
  1848.     J=ICHAR(LINE(I))
  1849.     IF(J.EQ.255)I255X=3
  1850.     IF(I255X.LE.0)GOTO 3107
  1851. C SKIP ENCODED VARIABLE NAMES
  1852.     I255X=I255X-1
  1853.     GOTO 107
  1854. 3107    CONTINUE
  1855.     IF (I.EQ.NONBLK) GOTO 107
  1856.     IF (LINE(I-1).EQ.QUOTE) GOTO 108
  1857.     IF(J.GE.97.AND.J.LE.122) LINE(I)=CHAR(J-32)
  1858. 107    CONTINUE
  1859. 108    CONTINUE
  1860. C
  1861. C  SEE IF A LIST OF POSSIBLE COMMANDS SHOULD BE PRINTED
  1862.     IF (LINE(NONBLK).NE.WHAT) GOTO 110
  1863.     CALL LIST
  1864.     GOTO 20
  1865. C
  1866. C  SEE IF IT IS A COMMAND
  1867. 110    IF (LINE(NONBLK).NE.STAR) GOTO 120
  1868.     CALL CMND (RETCD)
  1869.     GOTO (20,115,10,6120), RETCD
  1870. 6120    RETURN
  1871. C    STOP 110
  1872. C
  1873. C
  1874. C A READ COMMAND WAS EXECUTED SO LINE HOLDS THE NEW COMMAND LINE.
  1875. 115    CALL SLEND(RETCD)
  1876.     GO TO (103,20),RETCD
  1877.     RETURN
  1878. C    STOP 115
  1879. C
  1880. C  SEE IF ONLY ONE ALPHA CHARACTER
  1881. 120    J=NONBLK+1
  1882.     IF (LEND.NE.NONBLK) GOTO 130
  1883.     DO 124 I=1,27
  1884.     IF (LINE(NONBLK).EQ.ALPHA(I)) GOTO 126
  1885. 124    CONTINUE
  1886. C
  1887. C ALLOW FOR A SINGLE DIGIT TO BE ASSIGNED TO %
  1888.     DO 125 I=1,10
  1889.     IF(LINE(NONBLK).EQ.DIGITS(I,1))GO TO 130
  1890. 125    CONTINUE
  1891. C
  1892. C
  1893. C ALLOW FOR ENTERING THE ASCII BLANK
  1894.     IF(LINE(NONBLK).EQ.QUOTE)GO TO 130
  1895.     I=1
  1896.     GOTO 1001
  1897. C
  1898. C  OUTPUT VALUE OF SINGLE VARIABLE
  1899. 126    CALL VAROUT(I,1)
  1900.     GOTO 20
  1901. C
  1902. C
  1903. C CHECK INPUT FOR SYNTAX ERRORS
  1904. 130    CALL ERRCX (RETCD)
  1905.     GOTO (140,10),RETCD
  1906.     RETURN
  1907. C    STOP 130
  1908. C
  1909. C  CHANGE FROM INFIX TO POSTFIX NOTATION
  1910. 140    CALL INPOST (RETCD)
  1911.     GOTO (150,10), RETCD
  1912. C
  1913. C
  1914. C EVALUATE EXPRESSION
  1915. 150    CONTINUE
  1916.     CALL POSTVL(RETCD)
  1917.     GOTO(20,10),RETCD
  1918.     RETURN
  1919. C    STOP 150
  1920. C
  1921. C
  1922. C  EXIT
  1923. 900    CONTINUE
  1924.     IF (LEVEL.EQ.1) RETURN
  1925. C    IF (LEVEL.EQ.1) CALL EXIT
  1926.     IF(ITCNTV(LEVEL).EQ.0)GOTO 910
  1927.     IF(ZNEG(ITCNTV(LEVEL)).EQ.1)GO TO 910
  1928. C
  1929. C VALUE OF ITERATION VARIABLE IS POSITIVE SO REWIND FILE
  1930. C AND EXECUTE AGAIN.
  1931.     REWIND LEVEL
  1932.     GO TO 20
  1933. C
  1934. C
  1935. C EXIT FROM THIS LEVEL BY CLOSING THE FILE AND DECREASING VALUE
  1936. C OF LEVEL BY ONE.
  1937. 910    CLOSE(LEVEL)
  1938.     LEVEL=LEVEL-1
  1939.     GOTO 20
  1940. C
  1941. C
  1942. C
  1943. C *** ERROR PROCESSING ***
  1944. 1000    I=27
  1945. 1001    CALL ERRMSG(I)
  1946.     GO TO 10
  1947.     END
  1948. c -h- calun.for    Fri Aug 22 13:00:17 1986    
  1949.     SUBROUTINE CALUN(RETCD)
  1950. C COPYRIGHT (C) 1983,1984 GLENN AND MARY EVERHART
  1951. C ALL RIGHTS RESERVED
  1952. C 60=MAX REAL ROWS
  1953. C 301=MAX REAL COLS
  1954. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  1955.  
  1956. C VBLS AND TYPE DIMENSIONED 60,301
  1957. C  *****************************************************
  1958. C  *             SUBROUTINE   CALUN                    *
  1959. C  *****************************************************
  1960. C
  1961. C  SUBROUTINE CALUN PERFORMS A UNARY OPERATION.
  1962. C
  1963. C  UPON ENTRANCE:
  1964. C    OPERATOR IS ON STACK 2
  1965. C    OPERAND IS ON STACK 1
  1966. C  UPON EXIT:
  1967. C    OPERATOR HAS BEEN POPPED OFF STACK 2
  1968. C    RESULT IS ON STACK 1
  1969. C
  1970. C    RETCD    MEANING
  1971. C
  1972. C    1    O.K.
  1973. C    2    ERROR
  1974. C
  1975. C   MODIFICATION CLASSES: M3, M4, AND M8
  1976. C
  1977. C  CALUN CALLS
  1978. C
  1979. C  CONTYP   CONVERTS DATA TYPES
  1980. C  ERRMSG   PRINTS ERROR MESSAGES
  1981. C  $DATAN   ARC TANGENT
  1982. C  $DCOS    COSINE
  1983. C  $DEXP    E**X
  1984. C  $DLOG    NATURAL LOG
  1985. C  $DLOG10  LOG BASE 10
  1986. C  $DSIN    SINE
  1987. C  $DSQRT   SQUARE ROOT
  1988. C  $DTANH   HYPERBOLIC TANGENT
  1989. C
  1990. C  CALUN IS CALLED BY POSTVL WHICH CONVERTS FROM INFIX TO POSTFIX
  1991. C
  1992. C     VARIABLE    USE
  1993. C
  1994. C  RETCD      RETURN CODE:  1 = O.K.   2 = ERROR
  1995. C  J,K,K2,I   HOLD TEMPORARY VALUES
  1996. C  MINUS      VALUE IN LAST MULTIPLE PRECISION BYTE.
  1997. C             USED TO INDICATE A NEGATIVE NUMBER.
  1998. C  PLUS       VALUE IN LAST MULTIPLE PRCISION BYTE.
  1999. C             USED TO INDICATE A POSITIVE NUMBER.
  2000. C  REAL       TEMPORARY DOUBLE PRECISION VALUES.
  2001. C  INT        TEMPORARY INTEGER*4 VALUES.
  2002. C  ST1TYP(40) TYPE FOR EACH ELEMENT ON STACK 1
  2003. C  ST2TYP(40) TYPE FOR EACH ELEMENT OF STACK 2
  2004. C  ST1PT      POINTS TO TOP OF STACK 1
  2005. C  ST2PT      POINTS TO TOP OF STACK 2
  2006. C  STACK1     HOLDS OPERAND
  2007. C  STACK2     HOLDS UNARY OPERATOR
  2008. C
  2009. C    SUBROUTINE CALUN(RETCD)
  2010.     REAL*8 REAL
  2011.     REAL*8 DABS,DEXP,DLOG,DLOG10,DSQRT,DSIN,DCOS
  2012.     REAL*8 DASIN,DACOS,DTAN
  2013.     REAL*8 DTANH,DATAN
  2014. C
  2015.     REAL*4 FLOAT
  2016. C
  2017.     INTEGER*4 INT
  2018. C
  2019.     InTeGer*4 RETCD,RETCD2
  2020.     InTeGer*4 ST1TYP(40),ST2TYP(40),ST1PT,ST2PT,ST1LIM,ST2LIM
  2021.     InTeGer*4 K,K2
  2022. C
  2023.     CHARACTER*1 STACK1(8,40),STACK2(8,40),FOUR(4),EIGHT(8)
  2024.     CHARACTER*1 PLUS,MINUS
  2025. C
  2026.     EQUIVALENCE (FOUR,INT),(EIGHT,REAL)
  2027. C
  2028.     COMMON /STACK/STACK1,STACK2,ST1PT,ST2PT,
  2029.      ;          ST1TYP,ST2TYP,ST1LIM,ST2LIM
  2030. C
  2031. C    DATA PLUS/0/,MINUS/1/
  2032. C
  2033.     PLUS=0
  2034.     MINUS=1
  2035.     RETCD=1
  2036.     K=ST2TYP(ST2PT-1)
  2037.     K2=ST1TYP(ST1PT-1)
  2038. C
  2039. C
  2040. C MAKE SURE VARIABLE IS DEFINED
  2041.     IF(K2.GT.0)GOTO 50
  2042. C IF NOT, PRINT MESSAGE AND RETURN
  2043.     CALL ERRMSG(16)
  2044.     GOTO 89999
  2045. C
  2046. 50    J=K
  2047. C
  2048. C
  2049. C SEE IF IT IS A UNARY MINUS
  2050.     IF (J.EQ.111) GOTO 100
  2051. C
  2052. C
  2053. C  FUNCTIONS START AT 31
  2054.     K=K-30
  2055.     GOTO (100,100,300,400,500,400,10000),K
  2056.     GOTO 10000
  2057. C
  2058. C
  2059. C  ***************************************
  2060. C  *** ABS (=DABS), IABS, AND UNARY -  ***
  2061. C  ***************************************
  2062. 100    CONTINUE
  2063.     IF(K2.GT.0)GO TO 105
  2064.     CALL ERRMSG(16)
  2065.     GO TO 89999
  2066. 105    GOTO (110,120,130,130,140,140,140,130,120),K2
  2067.     STOP 100
  2068. C
  2069. C
  2070. C  ASCII
  2071. 110    CALL ERRMSG (12)
  2072.     GOTO 89999
  2073. C
  2074. C
  2075. C  DECIMAL AND REAL
  2076. 120    DO 121 I=1,8
  2077. 121    EIGHT(I)=STACK1(I,ST1PT-1)
  2078.     IF (K.NE.111) GOTO 123
  2079. C
  2080. C
  2081. C  UNARY -
  2082.     REAL=-REAL
  2083.     GOTO 124
  2084. 123    REAL=DABS(REAL)
  2085. 124    DO 125 I=1,8
  2086. 125    STACK1(I,ST1PT-1)=EIGHT(I)
  2087.     GOTO 90000
  2088. C
  2089. C
  2090. C  INTEGER, HEXADECIMAL, AND OCTAL
  2091. 130    DO 131 I=1,4
  2092. 131    FOUR(I)=STACK1(I,ST1PT-1)
  2093.     IF (K.NE.111) GOTO 133
  2094.     INT=-INT
  2095.     GO TO 134
  2096. 133    IF(INT.LT.0)INT=-INT
  2097. 134    DO 135 I=1,4
  2098. 135    STACK1(I,ST1PT-1)=FOUR(I)
  2099.     GOTO 90000
  2100. C
  2101. C
  2102. C  MULTIPLE PRECISION
  2103. 140    IF (K.NE.111) GOTO 150
  2104.     IF (STACK1(8,ST1PT-1).EQ.PLUS)GOTO 160
  2105. 150    STACK1(8,ST1PT-1)=PLUS
  2106.     GOTO 90000
  2107. 160    STACK1(8,ST1PT-1)=MINUS
  2108.     GOTO 90000
  2109. C
  2110. C
  2111. C  ***************************************
  2112. C  ************  FLOAT  ******************
  2113. C  ***************************************
  2114. 300    CONTINUE
  2115.     GOTO (310,320,330,330,340,340,340,330,320),K2
  2116. C
  2117. C
  2118. C  ASCII
  2119. 310    CALL ERRMSG(12)
  2120.     GOTO 89999
  2121. C
  2122. C
  2123. C  REAL (=DECIMAL)
  2124. 320    CALL ERRMSG (13)
  2125.     GOTO 89999
  2126. C
  2127. C
  2128. C  INTEGER=HEXADECIMAL=OCTAL
  2129. 330    DO 333 I=1,4
  2130. 333    FOUR(I)=STACK1(I,ST1PT-1)
  2131.     REAL=FLOAT(INT)
  2132.     DO 335 I=1,8
  2133. 335    STACK1(I,ST1PT-1)=EIGHT(I)
  2134.     ST1TYP(ST1PT-1)=2
  2135.     GOTO 90000
  2136. C
  2137. C
  2138. C  MULTIPLE PRECISION
  2139. 340    CALL ERRMSG (11)
  2140.     GOTO 89999
  2141. C
  2142. C
  2143. C
  2144. C  ***************************************
  2145. C  *******  IFIX AND INT (=IDINT)  *******
  2146. C  ***************************************
  2147. 400    CONTINUE
  2148.     GOTO (410,420,430,430,440,440,440,430,420),K2
  2149.     STOP 400
  2150. C
  2151. C
  2152. C  ASCII
  2153. 410    CALL ERRMSG (12)
  2154.     GOTO 89999
  2155. C
  2156. C
  2157. C  REAL AND DECIMAL
  2158. 420    DO 421 I=1,8
  2159. 421    EIGHT(I)=STACK1(I,ST1PT-1)
  2160.     INT=IDINT(REAL)
  2161.     DO 424 I=1,4
  2162. 424    STACK1(I,ST1PT-1)=FOUR(I)
  2163.     ST1TYP(ST1PT-1)=4
  2164.     GOTO 90000
  2165. C
  2166. C
  2167. C  INTEGER, HEXADECIMAL, AND OCTAL
  2168. 430    CALL ERRMSG (10)
  2169.     GOTO 89999
  2170. C
  2171. C
  2172. C  MULTIPLE PRECISION
  2173. 440    CALL ERRMSG (11)
  2174.     GOTO 89999
  2175. C
  2176. C
  2177. C
  2178. C  ***************************************
  2179. C  ***************  AINT  ****************
  2180. C  ***************************************
  2181. C
  2182. C  REAL TO REAL TRUNCATION
  2183. 500    CONTINUE
  2184.     GOTO (510,520,530,530,540,540,540,530,520),K2
  2185. C
  2186. C
  2187. C  ASCII
  2188. 510    CALL ERRMSG (12)
  2189.     GOTO 89999
  2190. C
  2191. C
  2192. C  REAL AND DECIMAL
  2193. 520    DO 522 I=1,8
  2194. 522    EIGHT(I)=STACK1(I,ST1PT-1)
  2195. C
  2196. C DON'T USE AINT(SNGL(REAL)) BECAUSE THEN
  2197. C 2.9999999 RESULTS IN 3.0
  2198.     REAL=DINT(REAL)
  2199.     DO 524 I=1,8
  2200. 524    STACK1(I,ST1PT-1)=EIGHT(I)
  2201.     GOTO 90000
  2202. C
  2203. C
  2204. C  INTEGER, HEXADECIMAL, AND OCTAL
  2205. 530    CALL ERRMSG (10)
  2206.     GOTO 89999
  2207. C
  2208. C
  2209. C  MULTIPLE PRECISION
  2210. 540    CALL ERRMSG(11)
  2211.     GOTO 89999
  2212. C
  2213. C
  2214. C
  2215. C
  2216. C  ****************************************
  2217. C  ****************************************
  2218. C  ********                        ********
  2219. C  ******** REAL TO REAL FUNCTIONS ********
  2220. C  ********                        ********
  2221. C  ********  EXP      (=DEXP)      ********
  2222. C  ********  ALOG     (=DLOG)      ********
  2223. C  ********  ALOG10   (=DLOG10)    ********
  2224. C  ********  SQRT     (=DSQRT)     ********
  2225. C  ********  SIN      (=DSIN)      ********
  2226. C  ********  COS      (=DCOS)      ********
  2227. C  ********  TANH     (DTANH)      ********
  2228. C  ********  ATAN     (=DATAN)     ********
  2229. C  ********                        ********
  2230. C  ****************************************
  2231. C  ****************************************
  2232. C
  2233. C
  2234. C
  2235. 10000    CONTINUE
  2236.     GOTO (11000,12000,15000,15000,15000,15000,15000,15000,12000),K2
  2237.     STOP 10000
  2238. C
  2239. C
  2240. C  ASCII
  2241. 11000    CALL ERRMSG (12)
  2242.     GOTO 89999
  2243. C
  2244. C
  2245. C  REAL AND DECIMAL
  2246. 12000    DO 12010 I=1,8
  2247. 12010    EIGHT(I)=STACK1(I,ST1PT-1)
  2248.     K=K-6
  2249.     GOTO (12100,12200,12300,12400,12500,12600,12700,12800,
  2250.      1  12840,12860,12880),K
  2251. C
  2252. C
  2253. C  EXP
  2254. 12100    REAL=DEXP(REAL)
  2255.     GOTO 14000
  2256. C
  2257. C
  2258. C  ALOG
  2259. 12200    REAL=DLOG(REAL)
  2260.     GOTO 14000
  2261. C
  2262. C
  2263. C  DLOG10
  2264. 12300    REAL=DLOG10(REAL)
  2265.     GOTO 14000
  2266. C
  2267. C
  2268. C  DSQRT
  2269. 12400    IF (REAL.GE.0.D0) GOTO 12410
  2270. 12405    CALL ERRMSG (14)
  2271.     GOTO 89999
  2272. 12410    REAL=DSQRT (REAL)
  2273.     GOTO 14000
  2274. C
  2275. C
  2276. C  DSIN
  2277. 12500    REAL=DSIN(REAL)
  2278.     GOTO 14000
  2279. C
  2280. C
  2281. C  DCOS
  2282. 12600    REAL=DCOS(REAL)
  2283.     GOTO 14000
  2284. C
  2285. C
  2286. C  DTANH
  2287. 12700    REAL=DTANH(REAL)
  2288.     GOTO 14000
  2289. C
  2290. C
  2291. C  DATAN
  2292. 12800    REAL=DATAN(REAL)
  2293.     GOTO 14000
  2294. C
  2295. C ASIN
  2296. 12840    CONTINUE
  2297.     IF(REAL.LT. -1.0.OR.REAL.GT. 1.0) GOTO 12405
  2298.     REAL=DASIN(REAL)
  2299.     GOTO 14000
  2300. C
  2301. C ACOS
  2302. 12860    CONTINUE
  2303.     IF(REAL.LT. -1.0.OR.REAL.GT. 1.0) GOTO 12405
  2304.     REAL=DACOS(REAL)
  2305.     GOTO 14000
  2306. C
  2307. C TAN
  2308. 12880    CONTINUE
  2309.     IF(REAL.GT.1.570795)REAL=1.570795
  2310.     IF(REAL.LT. -1.570795) REAL = -1.570795
  2311. C CLAMP TO AVOID OVERFLOW
  2312.     REAL=DTAN(REAL)
  2313. C    GOTO 14000
  2314. C (GOTO NOT NEEDED IF THIS IS THE LAST FUNCTION)
  2315. 14000    DO 14010 I=1,8
  2316. 14010    STACK1(I,ST1PT-1)=EIGHT(I)
  2317.     GOTO 90000
  2318. C
  2319. C
  2320. C  INTEGER, HEXADECIMAL, OCTAL, AND MULTIPLE PRECISION
  2321. 15000    CONTINUE
  2322.     CALL CONTYP(STACK1,ST1PT-1,K2,2,RETCD2)
  2323.     GO TO(15010,89999),RETCD2
  2324.     STOP 15000
  2325. 15010    ST1TYP(ST1PT-1)=2
  2326.     GO TO 12000
  2327. C
  2328. C
  2329. C  EXIT
  2330. 89999    RETCD=2
  2331. 90000    ST2PT=ST2PT-1
  2332.     RETURN
  2333.     END
  2334. c -h- ce2a.fms    Fri Aug 22 13:00:17 1986    
  2335.     SUBROUTINE CE2A(LNIN,LNOUT)
  2336. C CONVERT ENCODED FORMULAS TO NORMAL ASCII
  2337. C NOTE: ONLY HAS TO HANDLE STANDARD NAMES AS A$5$ TYPE FORMS AND P# AND D# FORMS
  2338. C ARE NOT TRANSLATED TO PACKED ONES.
  2339.     CHARACTER*1 NAME(4),NUMBER(6)
  2340.     CHARACTER*1 LNIN,LNOUT
  2341.     CHARACTER*6 NUMBR6
  2342.     EQUIVALENCE(NUMBR6(1:1),NUMBER(1))
  2343.     DIMENSION LNIN(128),LNOUT(128)
  2344. CCC    InTeGer*4 IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  2345. CCC    COMMON/DOLLR/IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  2346.     InTeGer*4 RRWACT,RCLACT
  2347. C    COMMON/RCLACT/RRWACT,RCLACT
  2348.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  2349.      1  IDOL7,IDOL8
  2350. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  2351. C     1  IDOL7,IDOL8
  2352.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  2353. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  2354.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  2355. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  2356. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  2357. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  2358.     InTeGer*4 KLVL
  2359. C    COMMON/KLVL/KLVL
  2360.     InTeGer*4 IOLVL,IGOLD
  2361. C    COMMON/IOLVL/IOLVL
  2362. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  2363. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  2364.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  2365.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  2366.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  2367.      3  k3dfg,kcdelt,krdelt,kpag
  2368. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  2369. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  2370. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  2371. C    LOGICAL*2 L63,L192,L255,L127
  2372.     LOGICAL*4 L1,L2
  2373. C    InTeGer*4 I63,I192,I255,I127
  2374.     InTeGer*4 I63,I192,I127
  2375.     InTeGer*4 I1,I2
  2376. C    EQUIVALENCE(L127,I127)
  2377. C    EQUIVALENCE(I63,L63),(I192,L192),(I255,L255)
  2378.     EQUIVALENCE (I1,L1),(I2,L2)
  2379.     INTEGER*4 FNAM(25)
  2380.     character*4 fnmx(25)
  2381.     CHARACTER*1 FCHNM(4,25)
  2382.     equivalence(fnmx(1)(1:1),fnam(1),fchnm(1,1))
  2383. c    EQUIVALENCE(FNAM(1),FCHNM(1,1))
  2384.     DATA FNMX/'MIN ','MAX ','AVG ','SUM ','STD ','IF  ',
  2385.      1  'AND ','IOR ','NOT ','CNT ','NPV ','LKP ',
  2386.      2  'LKN ','LKE ','XOR ','EQV ','MOD ','REM ','SGN ','IRR ',
  2387.      3  'RND ','PMT','PVL','AVE','CHS'/
  2388. C    DATA I63/63/,I192/192/,I255/255/,I128/128/
  2389.     DATA I63/63/,I192/192/,I127/127/
  2390.     LI=1
  2391.     LO=1
  2392. C LI = INPUT LOCATION
  2393. C LO=OUTPUT LOCATION
  2394. 100    CONTINUE
  2395.     LCC=ICHAR(LNIN(LI))
  2396.     IF(LCC.NE.255)GOTO 200
  2397. C FIND BINARY PATTERNS TO USE
  2398.     I1=ICHAR(LNIN(LI+1))
  2399.     I2=IMASK(I1,I192)
  2400. C    L2=L1.AND.L192
  2401.     I1=IMASK(I1,I63)
  2402. C    L1=L1.AND.L63
  2403.     ID1=I1
  2404.     I1=ICHAR(LNIN(LI+2))
  2405.     I1=IMASK(I1,I127)
  2406. C    L1=L1.AND.L127
  2407.     ID2=I2*2+I1
  2408.     LI=MIN0(LI+3,109)
  2409. C DO MASKING TO GET BINARY COORDS
  2410.     CALL IN2AS(ID1,NAME)
  2411. C NAME GETS 4 CHARACTERS TO USE FOR COL. LABEL
  2412.     IL2=ID2-1
  2413.     WRITE(NUMBR6(1:6),1000)IL2
  2414. C    ENCODE(6,1000,NUMBER)IL2
  2415. 1000    FORMAT(I6)
  2416. C NOW NAME AND NUMBER ARRAYS HAVE LETTERS, DIGITS, OR SPACES.
  2417. C THROW OUT SPACES AND COPY THE REST.
  2418.     DO 202 N=1,4
  2419.     IF(ICHAR(NAME(N)).LE.32)GOTO 202
  2420.     LNOUT(LO)=NAME(N)
  2421.     LO=LO+1
  2422.     IF(LO.GT.110)GOTO 300
  2423. 202    CONTINUE
  2424.     DO 203 N=1,6
  2425.     IF(ICHAR(NUMBER(N)).LE.32)GOTO 203
  2426. C IF 32 ISN'T SPACE, LOSE
  2427.     LNOUT(LO)=NUMBER(N)
  2428.     LO=LO+1
  2429.     IF(LO.GT.110)GOTO 300
  2430. 203    CONTINUE
  2431.     GOTO 300
  2432. C COPY MISC. CHARACTER
  2433. 200    CONTINUE
  2434.     II=ICHAR(LNIN(LI))
  2435.     IF(II.LT.230.OR.II.GT.254)GOTO 220
  2436. C FUNCTION NAME...
  2437.     II=II-229
  2438.     LNOUT(LO)=FCHNM(1,II)
  2439.     LNOUT(LO+1)=FCHNM(2,II)
  2440.     LNOUT(LO+2)=FCHNM(3,II)
  2441.     LI=LI+1
  2442.     LO=LO+3
  2443. C FILL IN ASCII FORM OF FUNCTION HERE...
  2444.     GOTO 300
  2445. 220    CONTINUE
  2446.     LNOUT(LO)=LNIN(LI)
  2447.     LO=LO+1
  2448.     LI=LI+1
  2449. 300    IF(LO.LT.109.AND.LI.LT.109)GOTO 100
  2450. C THIS LOOPS EITHER COPYING LINE OR FINDING VARIABLES TILL DONE.
  2451.     LO=MIN0(LO,110)
  2452.     DO 400 N=LO,110
  2453. 400    LNOUT(N)=0
  2454.     DO 1 N=111,128
  2455. 1    LNOUT(N)=LNIN(N)
  2456. C DEFAULT ALL OF FORM LINES EXCEPT FORMULA IDENTICAL TO THE INPUT.
  2457.     RETURN
  2458.     END
  2459. c -h- cmdmun.for    Fri Aug 22 13:00:17 1986    
  2460.     SUBROUTINE CMDMUN(LINE)
  2461. C COPYRIGHT (C) 1983, 1984 GLENN AND MARY EVERHART
  2462. C ALL RIGHTS RESERVED
  2463. ccc
  2464. ccc junk VT100 escape sequence parsing except for arrow keys and
  2465. ccc PF2 since it's mostly not useful in MSDOS anyway.
  2466. ccc
  2467.     CHARACTER*1 LINE(120),LC,LINBUF(120),CW(120)
  2468. C    InTeGer*4 IOLVL,IGOLD
  2469.     EXTERNAL INDX
  2470. C    COMMON/IOLVL/IOLVL,IGOLD
  2471.     InTeGer*4 RRWACT,RCLACT
  2472. C    COMMON/RCLACT/RRWACT,RCLACT
  2473.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  2474.      1  IDOL7,IDOL8
  2475. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  2476. C     1  IDOL7,IDOL8
  2477.     Logical LEXIST
  2478.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  2479. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  2480.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  2481. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  2482. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  2483. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  2484.     InTeGer*4 KLVL
  2485. C    COMMON/KLVL/KLVL
  2486.     InTeGer*4 IOLVL,IGOLD
  2487. C    COMMON/IOLVL/IOLVL
  2488. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  2489. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  2490.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  2491.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  2492.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  2493.      3  k3dfg,kcdelt,krdelt,kpag
  2494. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  2495. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  2496. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  2497. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  2498. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  2499.     Integer*4 FH
  2500.     Common/CONSFH/FH
  2501.     Integer Initd,UseDK,UseDF
  2502.     Data Initd/0/
  2503. c Assume compilation with -h so this stays around
  2504.     If(Initd.ne.0)Goto 2408
  2505.     Initd=1
  2506.     UseDF=0
  2507.     UseDK=0
  2508. c Before inserting the DK: part, check that dk:AKA.CMD can be found.
  2509.     Inquire(File='AKA.CMD',Exist=Lexist)
  2510.     If(Lexist)UseDF=1
  2511.     If(LExist)goto 2408
  2512. C Inquire on login directory first; if file not there THEN look in DK:
  2513. c This allows one to avoid a system requestor for device DK
  2514.     Inquire(File='DK:AKA.CMD',EXIST=LEXIST)
  2515.     If(Lexist)UseDF=1
  2516.     IF(Lexist)UseDK=1
  2517. c Usedk = 1 if stuff is seen in dk:
  2518. c usedf = 1 if stuff found in default OR dk:
  2519. 2408    Continue
  2520.     ITERX=0
  2521. C ALLOW RESCAN OF READ-IN COMMANDS UP TO 10 TIMES.
  2522. 6501    CONTINUE
  2523.     ITERX=ITERX+1
  2524.     IF(ITERX.GT.10)RETURN
  2525.     LI=1
  2526. C ALLOW ARROWS OR OTHER SIMILAR KEYS TO BE RECOGNIZED
  2527.     LL=ICHAR(LINE(LI))
  2528. C ALLOW ! OR ESCAPE TO BE LEADIN FOR ESCAPE SEQUENCES
  2529.     IF(LL.EQ.155.OR.LL.EQ.33.OR.LL.EQ.27)GOTO 1000
  2530. C ALLOW % SPECIAL TREATMENT
  2531.     IF(ICHAR(LINE(1)).EQ.37)GOTO 7000
  2532.     IF(LINE(1).EQ.'^')IGOLD=IGOLD+1
  2533.     IF(LINE(1).EQ.'^')GOTO 7223
  2534. C IF WE SEE , COULB BE THAT ESC GOT EATEN BY VMS...
  2535.     IF(LINE(LI).EQ.'[')GOTO 1000
  2536. C CONVERT LOWER TO UPPER CASE
  2537.     NMX=120
  2538.     DO 41 N=1,120
  2539. C CHECK FOR DOUBLE QUOTE (34 DECIMAL). LEAVE L.C. IF SO
  2540.     NNN=ICHAR(LINE(N))
  2541.     IF(NNN.EQ.34)NMX=2
  2542. C IF WE SEE " CHARACTER THEN ONLY CONVERT 1ST 2 CHARACTERS TO U.C.
  2543. 41    CONTINUE
  2544.     JFED=0
  2545.     DO 1 N=1,NMX
  2546.     LL=ICHAR(LINE(N))
  2547.     IF(LL.GT.96.AND.LL.LT.123)LL=LL-32
  2548.     LINE(N)=CHAR(LL)
  2549.     IF(LINE(N).EQ.'_'.AND.LINE(N+1).EQ.'_')JFED=N
  2550. 1    CONTINUE
  2551.     IF(JFED.LE.0)GOTO 520
  2552. C IF __ SEEN (2 UNDERSCORES IN A ROW), CALL FRMEDT AFTER REMOVING THE __ FROM
  2553. C THE COMMAND LINE.
  2554.     DO 521 KKK=JFED,118
  2555.     LINE(KKK)=LINE(KKK+2)
  2556. 521    CONTINUE
  2557.     LINE(119)=Char(0)
  2558.     LINE(120)=Char(0)
  2559.     KKK=110
  2560.     CALL FRMEDT(LINE,KKK)
  2561. 520    CONTINUE
  2562.     IF(LINE(1).NE.'M')GOTO 2000
  2563. C    IF(LINE(1).NE.'M')RETURN
  2564.     LI=2
  2565.     GOTO 1000
  2566. 1000    CONTINUE
  2567. C HANDLE ESCAPE SEQUENCES
  2568. C ENCODE VT100 SEQUENCES HERE. MUST MODIFY FOR OTHERS.
  2569. C IF VMS PASSES 2 ESCS, PASS 1ST, TEST SECOND.
  2570. C NOTE CURSOR UP,DOWN, RIGHT, LEFT ARE CODED AS ESC A,B,C, OR D
  2571. C WITH POSSIBLE CRUFT BETW ESC AND THE LETTER.
  2572.     LL=ICHAR(LINE(LI+1))
  2573.     IF(LL.EQ.155.OR.LL.EQ.27)LI=LI+1
  2574.     LC=ICHAR(LINE(LI+1))
  2575.     IF(LC.EQ.'['.OR.LC.EQ.'O')LC=ICHAR(LINE(LI+2))
  2576.     IF(LC.NE.'?'.AND.LC.NE.'Q')GOTO 10
  2577. C MAKE PF2 MEAN HELP, JUST LIKE EDT
  2578. C FIX UP AMIGA HELP KEY ALSO TO MEAN HELP...
  2579.     LINE(LI)=CHAR(72)
  2580. C 72 = ASCII FOR 'H'
  2581.     LGGG=IGOLD+8
  2582.     IF(IGOLD.LE.0)GOTO 488
  2583.     LINE(LI+1)=CHAR((LGGG/10)+48)
  2584.     LINE(LI+2)=CHAR(MOD(LGGG,10)+48)
  2585. 488    CONTINUE
  2586. C    RETURN
  2587.     GOTO 2000
  2588. 10    CONTINUE
  2589. C HANDLE AUX KEYPAD KEYS AS INDIRECTS (FOR NOW)
  2590. C MAP ENTER KEY INTO AUX KEYPAD RANGE
  2591.     IF(LC.EQ.'M')LC='o'
  2592.     IF(LC.GE.'l'.AND.LC.LE.'y')GOTO 2650
  2593.     IF(LC.GE.'P'.AND.LC.LE.'S')GOTO 2100
  2594. C HANDLE INDIRECT CALLS AT 2100 FOR PF1 THRU PF4 IF AANY
  2595.     LL=ICHAR(LC)
  2596.     IF(LL.GE.48.AND.LL.LE.63)GOTO 2640
  2597.     LL=LL-65
  2598. C SUBTRACT ASCII A
  2599.     IF (LL.LT.0.OR.LL.GT.3)GOTO 2000
  2600. C ARROW KEYS HERE. ADJUST AND PASS THEM TO REST OF PROGRAM
  2601.     LK=LL
  2602.     IF(LL.EQ.3)LK=2
  2603.     IF(LL.EQ.2)LK=3
  2604.     LK=LK+49
  2605. C ADJUST FOR ASCII VALUE
  2606.     LINE(LI)=CHAR(LK)
  2607. C STASH NEW CELL IN.
  2608. C DON'T DISTURB GOLD STATUS ON MOTION OR ON HELP. ONLY ON INDIRECT
  2609. C COMMAND FILES.
  2610.     RETURN
  2611. C    GOTO 2000
  2612. 2640    CONTINUE
  2613. C AMIGA FUNCTION KEYS
  2614.     LL=LL-48+ICHAR('l')
  2615.     LC=CHAR(LL)
  2616. c Fix up as though VT100 function chars and go on
  2617. 2650    CONTINUE
  2618.     LL=ICHAR(LC)
  2619.     LL=LL-ICHAR('l')+ICHAR('A')
  2620. C MAPPING IS:
  2621. C  KEY    CHAR    AKx.CMD  x=
  2622. C  0    p    E
  2623. c  1    q    F
  2624. C  2    r    G
  2625. c  3    s    H
  2626. c  4    t       I
  2627. c  5    u    J
  2628. c  6    v    K
  2629. c  7    w    L
  2630. c  8    x    M
  2631. c  9    y    N
  2632. c  ,    l    A
  2633. c  -    m    B
  2634. c  .    n    C
  2635. c ENTER o    D
  2636.     LC=CHAR(LL)
  2637.     LINE(1)=CHAR(64)
  2638. C 64 IS ASCII @ CHARACTER
  2639.     IVL=0
  2640. C INCLUDE "DK:" IN STRING
  2641. c
  2642.     If(UseDF.eq.0) Goto 7223
  2643.     If(UseDK.eq.0) Goto 2099
  2644.     LINE(2)='D'
  2645.     LINE(3)='K'
  2646.     LINE(4)=':'
  2647.     IVL=3
  2648. 2099    Continue
  2649.     LINE(2+IVL)='A'
  2650.     LINE(3+IVL)='K'
  2651.     GOTO 2600
  2652. 2100    CONTINUE
  2653. C GENERATE INDIRECT FILE CALLS FROM PF1, PF3, PF4 KEYS IF ANY
  2654. C (THESE GIVE LETTERS P, R, OR S)
  2655.     LINE(1)=CHAR(64)
  2656.     IVL=0
  2657.     If(UseDF.eq.0) Goto 7223
  2658.     If(UseDK.eq.0) Goto 2098
  2659.     LINE(2)='D'
  2660.     LINE(3)='K'
  2661.     LINE(4)=':'
  2662.     IVL=3
  2663. 2098    Continue
  2664.     LINE(2+IVL)='K'
  2665.     LINE(3+IVL)='Y'
  2666. 2600    CONTINUE
  2667.     LINE(4+IVL)=LC
  2668.     IF(IGOLD.LE.0)GOTO 7202
  2669. C GOLD ADDS EXTRA A,B,C,D,E,... ETC. AFTER FILENAME
  2670.     LINE(5+IVL)=CHAR(64+IGOLD)
  2671.     IVL=IVL+1
  2672. C ADD EXTRA LETTER FOR GOLDED COMMANDS
  2673. 7202    CONTINUE
  2674.     LINE(5+IVL)='.'
  2675.     LINE(6+IVL)='C'
  2676.     LINE(7+IVL)='M'
  2677.     LINE(8+IVL)='D'
  2678.     LINE(9+IVL)=0
  2679. C GENERATE @KYP, @KYR, OR @KYS COMMAND ON PF1, PF3, PF4
  2680. 2000    CONTINUE
  2681.     IGOLD=0
  2682.     RETURN
  2683. 7000    CONTINUE
  2684. C PROCESS %%% FORMS
  2685.     I1=INDX(LINE(2),37)
  2686. C IF I1 IS 1, THEN WE JUST HAVE %% AND THERE'S NOTHING TO DUMP TO
  2687. C THE SCREEN. OTHERWISE DUMP IT OUT HERE..
  2688.     I1=I1+1
  2689.     IF(I1.LE.2.OR.I1.GT.80)GOTO 7002
  2690.     II1=I1-1
  2691.     IV=II1-1
  2692.     CALL SWRT(LINE(2),IV)
  2693. 7301    FORMAT(80A1,60A1)
  2694. 7002    CONTINUE
  2695.     IF(I1.GT.80)RETURN
  2696. C COPY WHATEVER NEEDS TO BE COPIED TO LINBUF
  2697.     DO 7003 II=1,80
  2698. 7003    LINBUF(II)=0
  2699.     I2=INDX(LINE(I1+1),37)
  2700.     IF(I2.GT.80)RETURN
  2701.     I2=I2+I1
  2702.     I1=I1+1
  2703.     II2=I2-1
  2704.     II=0
  2705.     IF(II2.LT.I1)GOTO 7540
  2706.     DO 7004 LL=I1,II2
  2707.     II=II+1
  2708. 7004    LINBUF(II)=LINE(LL)
  2709. 7540    CONTINUE
  2710.     IF(I2.GT.80)RETURN
  2711. C IF LINE(I2+1) HAS & THEN CLOSE FILE RIGHT HERE AND BUG OFF
  2712.     IF(LINE(I2+1).NE.'&')GOTO 8005
  2713.     CLOSE (IOLVL)
  2714.     IOLVL=11
  2715.     LINE(I2+1)='\'
  2716. 8005    CONTINUE
  2717. C SEE IF LINE(I2+1) CONTAINS A ?
  2718.     IF(LINE(I2+1).NE.'?'.AND.LINE(I2+1).NE.'\')GOTO 7005
  2719. C HAVE TO READ IN USER'S LINE HERE... READ OFF UNIT 5 ALWAYS...
  2720.     LX=II+1
  2721. c    rewind 11
  2722. c    If(FH.NE.0)goto 9201
  2723. c    READ(11,7301,END=7035,ERR=7035)(LINBUF(II),II=LX,120)
  2724. c    rewind 11
  2725. c    Goto 9202
  2726. c9201    Continue
  2727. c read in main window
  2728.     Call Getttl(CW)
  2729.     If(ichar(cw(1)).eq.26.or.
  2730.      1  ichar(cw(1)).eq.28)goto 7035
  2731. c filter so funny chars are treated as eof... ctl Z or ctl \ are eof.
  2732.     KK=1
  2733. c copy to Linbuf array (as much as fits, anyway
  2734.     Do 9203 II=LX,120
  2735.     Linbuf(II)=CW(KK)
  2736.     KK=KK+1
  2737. 9203    Continue
  2738. c9202    Continue
  2739. c For AMIGA we use lun 11 for console, both input and output,
  2740. c for all commands except normal sheet operation (e.g. help etc.)
  2741. C NOW SEE IF LINBUF(LX) IS EITHER A \ CHAR OR ANY CONTROL CHARACTER
  2742.     LC=LINBUF(LX)
  2743.     IF(LINE(I2+1).EQ.'\'.OR.LINE(I2+1).EQ.'!')GOTO 7005
  2744.     IF(IOLVL.EQ.11)GOTO 7005
  2745. C IF WE SEE ANYTHING EXCEPT A CONTROL CHAR OR \, REWIND THE FILE...
  2746. C THIS ALLOWS US TO HAVE A SORT OF "ENTER MODE" AND A "COMMAND MODE"
  2747. C A LA SUPERCALC ETC.
  2748.     IF(LC.NE.'\'.AND.LC.GT.CHAR(32))REWIND IOLVL
  2749. C COMMENT OUT ANY TERMINAL COMMAND
  2750.     IF(LC.EQ.'\'.OR.LC.EQ.'!'.OR.LC.LE.CHAR(32))LINBUF(1)='*'
  2751.     GOTO 7005
  2752. 7035    CONTINUE
  2753. C RECOVER AFTER CTL-Z ON EXPECTED INPUT.
  2754. C    REWIND 5
  2755.     LINBUF(1)='*'
  2756.     CLOSE (IOLVL)
  2757. c    IF(IOLVL.EQ.11)OPEN(11,FILE='CON:40/150/300/40/Analy Command')
  2758.     IOLVL=11
  2759. 7005    CONTINUE
  2760.     DO 7006 II=1,120
  2761. 7006    LINE(II)=LINBUF(II)
  2762.     GOTO 6501
  2763. C ALLOW RESCAN OF COMMAND LINE AFTER READ-IN.
  2764. C    RETURN
  2765. C RETURN AFTER BUMPING IGOLD. COMMENT OUT CMD
  2766. 7223    CONTINUE
  2767.     LINE(1)='*'
  2768.     RETURN
  2769.     END
  2770. c -h- cmnd.f40    Fri Aug 22 13:00:17 1986    
  2771.     SUBROUTINE CMND(RETCD)
  2772. C COPYRIGHT (C) 1983 GLENN EVERHART
  2773. C ALL RIGHTS RESERVED
  2774. C 60=MAX REAL ROWS
  2775. C 301=MAX REAL COLS
  2776. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  2777. C VBLS AND TYPE DIMENSIONED 60,301
  2778. C   ***************************************************
  2779. C   *                                                 *
  2780. C   *         SUBROUTINE  CMND                        *
  2781. C   *                                                 *
  2782. C   ***************************************************
  2783. C
  2784. C
  2785. C  UPON ENTRANCE, NONBLK POINT TO THE "*" IN LINE
  2786. C  INDICATING A COMMAND.  THIS ROUTINE DETERMINES WHICH COMMAND
  2787. C  IS DESIRED AND CALLS THE APPROPRIATE SUBROUTINE.
  2788. C
  2789. C  RETCD:
  2790. C  1=NORMAL
  2791. C  2=BYPASS NEXT READ BECAUSE READ COMMAND HAS BEEN EXECUTED
  2792. C     TO CHANGE LINE(80)
  2793. C  3=ERROR, SO GO TO 1000 TO SET LEVEL=1
  2794. C
  2795. C
  2796. C MODIFY CLASSES: M1
  2797. C
  2798.  
  2799. C
  2800. C   CMND CALLS
  2801. C
  2802. C  AT      TO PROCESS A FILE OF CALC COMMANDS
  2803. C  BASCNG  TO CHANGE THE DEFAULT BASE FOR CONSTANTS
  2804. C  CLOSE   CLOSE FILE OF CALC COMMANDS
  2805. C  DECLR   DECLARE VAIABLES TO BE A CERTAIN DATA TYPE
  2806. C  ERRMSG  PRINTS ERROR MESSAGES
  2807. C  EXIT    RETURN TO OPERATING SYSTEM
  2808. C  GETNNB  GETS NEXT NON-BLANK FROM LINE(80)
  2809. C  STRCMP  LOOKS FOR A SPECIFIED STRING IN LINE(80)
  2810. C  ZERO    ZEROES ALL VARIABLES
  2811. C  ZNEG    TO SEE IF A VARIABLE HAS POSITIVE VALUE
  2812. C
  2813. C
  2814. C
  2815. C  CMND IS CALLED BY CALC WHO HAS IDENTIFIED THE '*'
  2816. C  INDICATING A COMMAND IS DESIRED.
  2817. C
  2818. C
  2819. C
  2820. C
  2821. C   VARIABLE      USE
  2822. C
  2823. C
  2824. C  CCHAR      TEMPORARILY HOLDS A SINGLE CHARACTER.
  2825. C  DIGITS    HOLDS ASCII REPRESENTATION OF DIGITS.
  2826. C  I         TEMPORARY INDEX.
  2827. C  ID        ARGUMENT FOR SUBROUTINE DECLR. INDICATES
  2828. C            A PARTICULAR DATA TYPE.
  2829. C  IPT       POINTER FOR LINE(80).
  2830. C  ITCNTV    0 IF NO ITERATION. IF POSITIVE, INDEX
  2831. C            OF VARIABLE USED TO CONTROL ITERATION ON THAT LEVEL.
  2832. C  KIND(15)  HOLDS FIRST LETTER OF ALL LEGAL COMMANDS.
  2833. C  LEVEL     HOLDS LOGICAL I/O UNIT WHERE NEXT COMMAND COMES FROM.
  2834. C  LINE(80)  HOLDS COMMAND LINE.
  2835. C  NONBLK    POINTER FOR LINE(80).
  2836. C  RETCD     HOLDS RETURN CODE.
  2837. C  RETCD2    HOLDS RETURN CODE.
  2838. C  VIEWSW    VIEW SWITCH:
  2839. C            0 = OFF
  2840. C            1 = DISPLAY COMMAND LINES
  2841. C            2 = DISPLAY VALUE OF EXPRESSIONS
  2842. C            3 = DISPLAY ALL
  2843. C
  2844. C
  2845. C
  2846. C    SUBROUTINE CMND(RETCD)
  2847. C
  2848. C
  2849. C    EXTERNAL INDX
  2850.     InTeGer*4 LEVEL,NONBLK,LEND
  2851.     InTeGer*4  RETCD,RETCD2,VIEWSW,BASED
  2852. C    InTeGer*4 IOLVL
  2853. C    COMMON/IOLVL/IOLVL
  2854.     InTeGer*4 ZNEG,ITCNTV(6)
  2855. C    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  2856. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  2857.     InTeGer*4 RRWACT,RCLACT
  2858. C    COMMON/RCLACT/RRWACT,RCLACT
  2859.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  2860.      1  IDOL7,IDOL8
  2861. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  2862. C     1  IDOL7,IDOL8
  2863.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  2864. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  2865.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  2866. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  2867. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  2868. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  2869.     InTeGer*4 KLVL
  2870. C    COMMON/KLVL/KLVL
  2871.     InTeGer*4 IOLVL,IGOLD
  2872. C    COMMON/IOLVL/IOLVL
  2873. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  2874. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  2875.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  2876.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  2877.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  2878.      3  k3dfg,kcdelt,krdelt,kpag
  2879. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  2880. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  2881. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  2882.     Character*1 WRK(130)
  2883.     CHARACTER*1 WRKX(130),WRK2X(130)
  2884.     CHARACTER*1 WRK2(128)
  2885.     CHARACTER*35 CWRK,CWRKX,CWRK2
  2886.     CHARACTER*11 CWRK2B
  2887.     Character*1 wrk2b(11)
  2888.     EQUIVALENCE(CWRK2B(1:1),WRK2(1),wrk2b(1))
  2889.     EQUIVALENCE(CWRK2(1:1),WRK2(1))
  2890.     EQUIVALENCE(WRK(1),WRKX(1),CWRK(1:1),CWRKX(1:1))
  2891. C    EQUIVALENCE(WRK(1),CWRK),(CWRKX,WRKX(1),WRK(1))
  2892. C DEFINE SOME LARGER ARRAYS TO NULL TERMINATE WRK AND WRK2 ARRAYS.
  2893. c    EQUIVALENCE(WRK(1),WRKX(1))
  2894.     EQUIVALENCE(WRK2(1),WRK2X(1))
  2895.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1)
  2896.     InTeGer*4 TYPE(1,1),VLEN(9)
  2897.     REAL*8 XAC,XVBLS(1,1)
  2898.     INTEGER*4 JVBLS(2,1,1)
  2899.     EQUIVALENCE(XAC,AVBLS(1,27))
  2900.     EQUIVALENCE(VBLS(1,1,1),JVBLS(1,1,1))
  2901.     EQUIVALENCE(VBLS(1,1,1),XVBLS(1,1))
  2902.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  2903.     CHARACTER*1 FVLD(1,1)
  2904.     COMMON/FVLDC/FVLD
  2905. C
  2906.     CHARACTER*1  LINE(80),KIND(23),ASCII(4),DEC(6),HEX(2),INT(6),
  2907.      ;  M10(2),M8(1),M16(2),OCTAL(4),REAL(3),CCHAR
  2908.     CHARACTER*1 DIGITS(16,3)
  2909. C
  2910.     COMMON  LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  2911.     COMMON /ITERA/ITCNTV
  2912.     COMMON /DIGV/ DIGITS
  2913.     character*127 c11wrk
  2914. C
  2915.     DATA KIND
  2916.      1/'@','A','B','C','D','E','H','I','M','N','O','R','S','V','Z'
  2917.      2,'P','W','G','Q','F','J','X','U'/
  2918. C NOTE PWGQFJX ADDED BY GCE FOR PORTACALC INTERFACE.
  2919. C  FREE: K,U,Y, + SPECIAL CHARACTERS (LIKE .,;'"#$%^, ETC.)
  2920.     DATA  ASCII/'S','C','I','I'/,  DEC/'E','C','I','M','A','L'/
  2921.     DATA  HEX/'E','X'/, INT/'N','T','E','G','E','R'/
  2922.     DATA  M10/'1','0'/,  M8/'8'/
  2923.     DATA  M16/'1','6'/
  2924.     DATA  OCTAL/'C','T','A','L'/
  2925.     DATA  REAL/'E','A','L'/
  2926. C    DATA WRKX/130*0/,WRK2X/130*0/
  2927. C
  2928. C
  2929. C
  2930. C PICK UP NON-BLANK CHARACTER AFTER '*'
  2931.     RETCD=1
  2932.     CALL GETNNB(IPT,RETCD2)
  2933.     GOTO(2,4),RETCD2
  2934.     STOP 2
  2935. 2    NONBLK=IPT
  2936. C NONBLK POINTS TO 1ST NONBLANK CHARACTER AFTER *
  2937. C
  2938.     DO 3 I=1,23
  2939.     IF (LINE(NONBLK).EQ.KIND(I)) GOTO 6
  2940. 3    CONTINUE
  2941. C
  2942. C
  2943. C UNIDENTIFIED COMMAND
  2944. 4    GOTO 995
  2945. C
  2946. C
  2947. C
  2948. C GO TO DIFFERENT SECTIONS ON THE BASIS OF THE FIRST CHARACTER
  2949. C OF THE COMMAND.
  2950. 6    GOTO (10,20,30,1000,40,50,60,70,80,90,100,110,50,
  2951.      1  130,140,210,220,250,290,330,360,480,780),I
  2952.     STOP 6
  2953. C
  2954. C
  2955. C
  2956. C
  2957. C **************************************************
  2958. C *****    *@  INDIRECT COMMAND PROCESSING    ******
  2959. C **************************************************
  2960. 10    CALL AT(RETCD)
  2961.     GOTO (1000,999),RETCD
  2962.     STOP 10
  2963. C
  2964. C
  2965. C
  2966. C
  2967. C **************************************************
  2968. C ******      *A     DECLARE TYPE ASCII       ******
  2969. C **************************************************
  2970. 20    CALL STRCMP (ASCII,4,RETCD2)
  2971.     ID=1
  2972.     GOTO (200,995),RETCD2
  2973.     STOP 20
  2974. C
  2975. C
  2976. C
  2977. C
  2978. C **************************************************
  2979. C ******       *B      BASE DEFAULT          *******
  2980. C **************************************************
  2981. 30    CONTINUE
  2982.     CALL BASCNG(RETCD2)
  2983.     write(c11wrk,34)based
  2984.     c11wrk(20:20)=char(13)
  2985.     c11wrk(21:21)=char(10)
  2986.     IF(VIEWSW.NE.0)call vwrt(c11wrk,21)
  2987. 34    FORMAT(' DEFAULT BASE IS ',I2)
  2988.     GO TO (1000,999),RETCD2
  2989.     STOP 30
  2990. C
  2991. C
  2992. C
  2993. C
  2994. C ********************************************************
  2995. C **   *C   COMMENT, JUST RETURN (VIA STATEMENT 1000)   **
  2996. C ********************************************************
  2997. C
  2998. C
  2999. C
  3000. C **************************************************
  3001. C *******     *D     DECLARE TYPE DECIMAL    *******
  3002. C **************************************************
  3003. 40    CALL STRCMP(DEC,6,RETCD2)
  3004.     ID=2
  3005.     GOTO (200,995),RETCD2
  3006.     STOP 40
  3007. C
  3008. C
  3009. C **************************************************
  3010. C **********          *E   EXIT             ********
  3011. C **************************************************
  3012. 50    CONTINUE
  3013. C SET RETCD=4 ON EXIT IF EXIT COMMAND, SO CALC RETURNS TO ITS CALLER.
  3014.     IF (LEVEL.EQ.1) RETCD=4
  3015.     IF (LEVEL.EQ.1) RETURN
  3016. C    IF (LEVEL.EQ.1) CALL EXIT
  3017.     IF(ITCNTV(LEVEL).EQ.0)GOTO 55
  3018.     IF(ZNEG(ITCNTV(LEVEL)).EQ.1)GOTO 55
  3019. C ITERATION VARIABLE IS POSITIVE SO EXECUTE FILE AGAIN
  3020.     REWIND LEVEL
  3021.     GO TO 1000
  3022. C
  3023. C NOTE THAT WHEN EXITING A LEVEL THAT WAS ITERATED, ITCNTV
  3024. C IS NOT SET TO ZERO. THIS REQUIRES THAT WHEN ENTERED AT
  3025. C SUBROUTINE 'AT' AND ITERATION IS NOT DESIRED, THAT ITCNTV
  3026. C MUST BE SET TO ZERO THERE
  3027.  
  3028. 55    CLOSE(LEVEL)
  3029.     LEVEL=LEVEL-1
  3030. 59    GOTO 1000
  3031. C
  3032. C
  3033. C
  3034. C
  3035. C
  3036. C **************************************************
  3037. C * *H DECLARE VARIABLES TO BE OF TYPE HEXADECIMAL *
  3038. C **************************************************
  3039. 60    CALL STRCMP (HEX,2,RETCD2)
  3040.     ID=3
  3041.     GOTO (200,995),RETCD2
  3042.     STOP 60
  3043. C
  3044. C
  3045. C
  3046. C
  3047. C **************************************************
  3048. C * *I DECLARE VARIABLE TO BE OF TYPE INTEGER (*4) *
  3049. C **************************************************
  3050. 70    CALL STRCMP (INT,6,RETCD2)
  3051.     ID=4
  3052.     GOTO (200,995),RETCD2
  3053.     STOP 70
  3054. C
  3055. C
  3056. C **************************************************
  3057. C *  *M  DECLARE VARIABLE TO BE MULTIPLE PRECISION *
  3058. C **************************************************
  3059. 80    CALL STRCMP (M10,2,RETCD2)
  3060.     ID=5
  3061.     GOTO (200,84),RETCD2
  3062.     STOP 80
  3063. C
  3064. C
  3065. C  SEE IF MULTIPLE PRECISION IS OCTAL
  3066. 84    CALL STRCMP (M8,1,RETCD2)
  3067.     ID=6
  3068.     GOTO (200,88),RETCD2
  3069.     STOP 84
  3070. C
  3071. C
  3072. C  SEE IF MULTIPLE PRECISION HEXADECIMAL
  3073. 88    CALL STRCMP (M16,2,RETCD2)
  3074.     ID=7
  3075.     GOTO (200,995),RETCD2
  3076.     STOP 88
  3077. C
  3078. C
  3079. C
  3080. C
  3081. C ************************************************************
  3082. C **  *N SUPPRESS PRINTING OF VARIABLES WHEN VALUES CHANGE  **
  3083. C ************************************************************
  3084. 90    VIEWSW=1
  3085.     GOTO 1000
  3086. C
  3087. C
  3088. C
  3089. C
  3090. C **************************************************
  3091. C ***  *O  DECLARE VARIABLE TO BE OF TYPE OCTAL  ***
  3092. C **************************************************
  3093. 100    CALL STRCMP (OCTAL,4,RETCD2)
  3094.     ID=8
  3095.     GOTO (200,995),RETCD2
  3096.     STOP 100
  3097. C
  3098. C
  3099. C
  3100. C
  3101. C
  3102. C **************************************************
  3103. C ***********     *R ENCOUNTERED       *************
  3104. C **************************************************
  3105. C
  3106. C  *R    SEE IF A REAL DECLARATION
  3107. 110    CALL STRCMP (REAL,3,RETCD2)
  3108.     ID=9
  3109.     GOTO (200,114),RETCD2
  3110.     STOP 110
  3111. C
  3112. C
  3113. C  OTHERWISE ASSUME A READ IS REQUIRED
  3114. 114    IF (LEVEL.NE.1) GOTO 117
  3115. c    Rewind 11
  3116.     c11wrk=char(13) // char(10) // 'Calr>'
  3117.     call vwrt(c11wrk,7)
  3118. c    WRITE(11,116)
  3119. c    Rewind 11
  3120.     GOTO 118
  3121. c116    FORMAT(' CALR>',$)
  3122. 117    Continue
  3123. c    Rewind 11
  3124.     c11wrk=char(13) // char(10) // 'Calc0>'
  3125.     c11wrk(7:7)=char(48+level)
  3126.     call vwrt(c11wrk,8)
  3127. cc    WRITE (11,119) LEVEL
  3128. c    Rewind 11
  3129. 119    FORMAT (' CALC<',I1,'>',$)
  3130. 118    Continue
  3131. c    Rewind 11
  3132.     Call vget(line,80)
  3133. c    READ (11,115,END=1000,ERR=990) LINE
  3134. c    Rewind 11
  3135. 115    FORMAT (80A1)
  3136. C
  3137. C  NOTE THAT IF <CR> IS HIT AS THE ONLY INPUT, RETURN IS NORMAL
  3138. C  AND PROCESSING CONTINUES ON LEVEL (RETCD=2)
  3139.     RETCD=2
  3140.     GOTO 1000
  3141. C
  3142. C
  3143. C
  3144. C
  3145. C
  3146. C ************************************************************
  3147. C ***  *V ACTIVATE PRINTING OF VARIABLE WHEN VALUES CHANGE ***
  3148. C ************************************************************
  3149. 129    NONBLK=IPT
  3150. 130    CALL GETNNB(IPT,RETCD2)
  3151.     GO TO (129,132),RETCD2
  3152.     STOP  130
  3153. 132    CCHAR=LINE(NONBLK)
  3154.     IF(CCHAR.NE.DIGITS(10,1))GO TO 134
  3155. C
  3156. C  *VIEW 0 ENCOUNTERED
  3157.     VIEWSW=0
  3158.     GO TO 1000
  3159. 134    IF(CCHAR.NE.DIGITS(1,1))GO TO 136
  3160. C
  3161. C *VIEW 1 ENCOUNTERED
  3162.     VIEWSW=1
  3163.     GO TO 1000
  3164. 136    IF(CCHAR.NE.DIGITS(2,1))GO TO 138
  3165.     VIEWSW=2
  3166.     GO TO 1000
  3167. 138    VIEWSW=3
  3168.     GOTO 1000
  3169. C
  3170. C
  3171. C
  3172. C
  3173. C **************************************************
  3174. C **********   *Z   ZERO OUT ALL VARIABLES  ********
  3175. C **************************************************
  3176. 140    CALL ZERO
  3177.     GOTO 1000
  3178. C
  3179. C
  3180. C
  3181. C
  3182. C
  3183. C MAKE DECLARATIONS
  3184. 200    CALL DECLR(ID,RETCD2)
  3185.     GO TO(1000,999),RETCD2
  3186.     STOP 200
  3187. C
  3188. C
  3189. C
  3190. C
  3191. C
  3192. C **** ERROR PROCESSING ****
  3193. C
  3194. 990    I=27
  3195.     REWIND LEVEL
  3196.     GO TO 998
  3197. 995    I=3
  3198. 998    CALL ERRMSG(I)
  3199. 999    RETCD=3
  3200. 1000    CONTINUE
  3201.     RETURN
  3202. C
  3203. C P COMMAND - SET PLACEMENT OF PHYSICAL POSN IN SHEET
  3204. C *P WILL PROMPT FOR INPUTS OF LOCATIONS.
  3205. C
  3206. 210    CONTINUE
  3207. C
  3208.     RETCD=1
  3209.     CALL CMND2(RETCD,1)
  3210.     RETURN
  3211. C W COMMAND - WRITE % TO CURRENT PHYSICAL LOC IN SHEET. USE E32.25
  3212. C FORMAT.
  3213. C  DOES NOT PROMPT. THEREFORE, IF USED INSIDE SPREADSHEET, HAS THE
  3214. C  EFFECT OF CONVERTING CURRENT CELL'S FORMULA TO A LITERAL NUMBER
  3215. C  AND FREEZING IT THAT WAY. THEREFORE A FORMULA CONTAINING *W WILL
  3216. C  NORMALLY ONLY EXECUTE THE *W ONCE (AFTERWARDS BEING OVERWRITTEN).
  3217. C
  3218. 220    CONTINUE
  3219.     RETCD=1
  3220.     CALL CMND2(RETCD,2)
  3221. C
  3222.     RETURN
  3223. C
  3224. C *G SEEN.
  3225. C THE SYNTAX OF *G IS *G V1,V2 WHICH WILL GET VALUE OF VBLS(G1,G2)
  3226. C  AND LOAD IT INTO %. THE DIMENSIONS ARE CLAMPED TO LEGAL BOUNDS
  3227. C  AND TYPE=4 MEANS USE INTEGER, TYPE=2 CONVERTS VARIABLES TO
  3228. C  INTEGER. CALLS VARSCN TO DO THIS STUFF.
  3229. C  THIS GIVES A MEASURE OF INDIRECTION.
  3230. 250    CONTINUE
  3231.     RETCD=1
  3232. C SAY ALL'S WELL.
  3233.     CALL CMND2(RETCD,3)
  3234. C
  3235.     RETURN
  3236. C
  3237. C *Q QUERY DATABASE COMMAND
  3238. C
  3239. C
  3240. 290    CONTINUE
  3241.     RETCD=1
  3242.     CALL CMND2(RETCD,4)
  3243. C
  3244.     RETURN
  3245. C
  3246. C *F LABEL  GOTO LABEL COMMAND (CONDITIONAL)
  3247. C
  3248. C
  3249. C THE SYNTAX OF THE *F COMMAND IS :
  3250. C  *F LABEL
  3251. C  WITH THE OPERATION OF LOCATING A LINE BEGINNING WITH THE
  3252. C  STRING "*CLABEL" (SO IT IS PASSED OVER BY NORMAL CALC
  3253. C  PROCESSING). THE INPUT FILE ON IOLVL IS REWOUND AND
  3254. C  SCANNING GOES TO THE EOF OR UNTIL THE STRING IS FOUND.
  3255. C  RETCD=2 IF NO SUCH LABEL IS FOUND.
  3256. C
  3257. C  AS A FURTHER AID, IF THE % VARIABLE IS 0 OR NEGATIVE, THE
  3258. C  COMMAND IS IGNORED.
  3259. 330    CONTINUE
  3260.     RETCD=1
  3261.     CALL CMND2(RETCD,5)
  3262. C
  3263.     RETURN
  3264. C
  3265. C *J LABEL - JUST LIKE *F LABEL BUT ON CALC'S COMMAND FILES.
  3266. C I.E., FINDS A LINE STARTING WITH *CLABEL
  3267. C (NOTE IT STARTS FROM START OF FILE AND DOES THIS ONLY IF % IS POSITIVE).
  3268. C ITERATION OF COMMAND FILES REMAINS UNDER NORMAL CONTROL.
  3269. 360    CONTINUE
  3270.     RETCD=1
  3271.     CALL CMND2(RETCD,6)
  3272.     RETURN
  3273. C *X COMMAND
  3274. C  XC FILESPEC CELLNAME
  3275. C    READS FILESPEC AS A SAVED SPEADSHEET (NUMERIC OR FORMULA)
  3276. C  AND LOADS ITS VALUE INTO CURRENT CELL AND % ACCUMULATOR. DOES
  3277. C  NOT LOAD FORMULA UNLESS F SEEN. THUS 2 VARIANTS:
  3278. C   *XF FILESPEC CELLNAME    LOAD FORMULA AND VALUE
  3279. C   *XV FILESPEC CELLNAME    LOAD VALUE
  3280. C NOTE ANY CHARACTER AFTER *X THAT ISN'T "F" IS EQUIVALENT TO V FOR EASY USE.
  3281. 480    CONTINUE
  3282.     RETCD=1
  3283.     CALL CMND2(RETCD,7)
  3284.     RETURN
  3285. C *U FUNCTION ARGS
  3286. C HANDLE USER FUNCTION CALL...
  3287. 780    CONTINUE
  3288.     RETCD=1
  3289. C PASS LINE AND ARGS TO SUBROUTINE TO PARSE (EXTERNALIZE THE WORK)
  3290. C COMMON /V/ HAS DATA NEEDED FOR ARGUMENTS...
  3291.     CALL USRFCT(LINE,RETCD,WRK2)
  3292. C IF RETCD CHANGES IN USRFCT THIS ALLOWS ERROR CODES BACK.
  3293.     RETURN
  3294.     END
  3295. c -h- cmnd2.f40    Fri Aug 22 13:00:17 1986    
  3296.     SUBROUTINE CMND2(RETCD,I)
  3297. C COPYRIGHT (C) 1983 GLENN EVERHART
  3298. C ALL RIGHTS RESERVED
  3299. C
  3300. C EXTRA ROUTINES MOVED HERE FROM INSIDE CMND SO THAT THEY CAN BE OVERLAIN IN
  3301. C 256K VERSION TO GAIN A GREAT DEAL OF SPACE.
  3302.     INCLUDE APARMS.INC
  3303.     EXTERNAL INDX
  3304.     InTeGer*4 LEVEL,NONBLK,LEND
  3305.     InTeGer*4  RETCD,RETCD2,VIEWSW,BASED
  3306. C    InTeGer*4 IOLVL
  3307. C    COMMON/IOLVL/IOLVL
  3308.     InTeGer*4 ZNEG,ITCNTV(6)
  3309. C    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  3310. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  3311.     InTeGer*4 RRWACT,RCLACT
  3312. C    COMMON/RCLACT/RRWACT,RCLACT
  3313.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  3314.      1  IDOL7,IDOL8
  3315. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  3316. C     1  IDOL7,IDOL8
  3317.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  3318. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  3319.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  3320. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  3321. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  3322. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  3323.     InTeGer*4 KLVL
  3324. C    COMMON/KLVL/KLVL
  3325.     InTeGer*4 IOLVL,IGOLD
  3326. C    COMMON/IOLVL/IOLVL
  3327. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  3328. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  3329.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  3330.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  3331.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  3332.      3  k3dfg,kcdelt,krdelt,kpag
  3333. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  3334. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  3335. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  3336.     CHARACTER*1 WRK2(128),LETA
  3337.     CHARACTER*35 CWRK,CWRKX,CWRK2
  3338.     CHARACTER*50 CWRK50
  3339.     EQUIVALENCE (CWRK50(1:1),CWRK(1:1))
  3340.     CHARACTER*11 CWRK2B
  3341.     Character*1 wrk2b(11)
  3342.     CHARACTER*1 WRKX(130),WRK2X(130)
  3343.     Character*1 WRK(128)
  3344.     EQUIVALENCE(CWRK2B,WRK2(1),Wrk2b(1),Cwrk2)
  3345. c    EQUIVALENCE(CWRK2,WRK2(1))
  3346.     EQUIVALENCE(WRK(1),WRKX(1),CWRK(1:1),CWRKX(1:1))
  3347. C    EQUIVALENCE(WRK(1),CWRK),(CWRKX,WRKX(1),WRK(1))
  3348. C DEFINE SOME LARGER ARRAYS TO NULL TERMINATE WRK AND WRK2 ARRAYS.
  3349. c    EQUIVALENCE(WRK(1),WRKX(1))
  3350.     EQUIVALENCE(WRK2(1),WRK2X(1))
  3351.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1)
  3352.     InTeGer*4 TYPE(1,1),VLEN(9)
  3353.     REAL*8 XAC,XVBLS(1,1)
  3354.     INTEGER*4 JVBLS(2,1,1)
  3355.     EQUIVALENCE(XAC,AVBLS(1,27))
  3356.     EQUIVALENCE(VBLS(1,1,1),JVBLS(1,1,1))
  3357.     EQUIVALENCE(VBLS(1,1,1),XVBLS(1,1))
  3358.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  3359.     CHARACTER*1 FVLD(1,1)
  3360.     COMMON/FVLDC/FVLD
  3361. C
  3362.     CHARACTER*1  LINE(80),CCHAR
  3363.     CHARACTER*1 DIGITS(16,3)
  3364. C
  3365.     COMMON  LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  3366.     COMMON /ITERA/ITCNTV
  3367.     COMMON /DIGV/ DIGITS
  3368. C I ARGUMENT SELECTS COMMAND.
  3369. C 1 = *P
  3370. C 2 = *W
  3371. C 3 = *G 
  3372. C 4 = *Q
  3373. C 5 = *F
  3374. C 6 = *G
  3375. C 7 = *X
  3376.     IF(I.NE.1)GOTO 7000
  3377. C *P COMMANDS
  3378. C IF THE COMMAND IS *P VAR THEN SET TO VARIABLE LOCATION.
  3379.     KK1=3
  3380.     KK2=20
  3381.     IF(LINE(3).EQ.'@')GOTO 217
  3382. C ONLY LOOK IN COLS 3-20. COLUMNS 1,2 ARE THE *W COMMAND.
  3383.     CALL VARSCN(LINE,KK1,KK2,KEK,KK,KKK,IVLD)
  3384.     IF(IVLD.NE.0)GOTO 216
  3385.     GOTO 218
  3386. 217    CONTINUE
  3387. C ALLOW *W@V1,V2 TO GOTO LOCATION OF V1,V2 (COL,ROW)
  3388. C  THIS ALLOWS PROGRAMMED ACCESS TO VARIABLES.
  3389.     L1=4
  3390.     L2=60
  3391.     CALL VARSCN(LINE,L1,L2,LSTCH,ID1A,ID2A,IVLD1)
  3392.     IF(IVLD1.EQ.0)GOTO 1000
  3393.     CALL TYPGET(ID1A,ID2A,TYPE(1,1))
  3394.     IF(TYPE(1,1).EQ.2)GOTO 219
  3395.     CALL JVBLGT(1,ID1A,ID2A,JVBLS(1,1,1))
  3396.     LCL=JVBLS(1,1,1)
  3397.     GOTO 2200
  3398. 219    CONTINUE
  3399.     CALL XVBLGT(ID1A,ID2A,XVBLS(1,1))
  3400.     LCL=XVBLS(1,1)
  3401. 2200    CONTINUE
  3402. C NOW HAVE COLUMN NUMBER. PASS DELIMITER (WHATEVER IT IS) AND GO ON
  3403.     L1=LSTCH+1
  3404.     L2=60
  3405. C ASSUME WE GET THERE WITHIN 60 CHARACTERS...
  3406.     CALL VARSCN(LINE,L1,L2,LSTCH,ID1B,ID2B,IVLD2)
  3407.     IF(IVLD2.EQ.0)GOTO 1000
  3408. C SEEMS LIKE OK VARIABLE... GO AHEAD
  3409.     CALL TYPGET(ID1B,ID2B,TYPE(1,1))
  3410.     CALL JVBLGT(1,ID1B,ID2B,JVBLS(1,1,1))
  3411.     LRW=JVBLS(1,1,1)
  3412.     IF(TYPE(1,1).EQ.2)CALL XVBLGT(ID1B,ID2B,XVBLS(1,1))
  3413.     IF(TYPE(1,1).EQ.2)LRW=XVBLS(1,1)
  3414. C ADJUST FOR ACCUMULATOR ROW BY ADDING 1
  3415.     LRW=LRW+1
  3416. C NOW HAVE COLUMN AND ROW NUMBERS. GET VARIABLE USING THEM AFTER
  3417. C CLAMPING TO MAX VALUES.
  3418.     LCL=MAX0(1,LCL)
  3419.     LRW=MAX0(1,LRW)
  3420.     LCL=MIN0(LCL,MCOLS)
  3421.     LRW=MIN0(LRW,MROWS)
  3422.     KK=LCL
  3423.     KKK=LRW
  3424.     GOTO 216
  3425. 218    CONTINUE
  3426. c    rewind 11
  3427.     IF(LEVEL.EQ.1)call Vwrt(' Set Phys loc. Column=',22)
  3428. c211    FORMAT(' SET PHYS LOC. COLUMN=')
  3429. c    rewind 11
  3430.     LLLV=LEVEL
  3431.     IF(LEVEL.EQ.1)LLLV=11
  3432.     if(lllv.ne.11)READ(LLLV,212,END=700,ERR=700)KK
  3433.     if(lllv.eq.11)call vgeti(kk)
  3434. 212    FORMAT(I7)
  3435. c    rewind 11
  3436.     IF(LEVEL.EQ.1)Call Vwrt(' Set Phys loc. Row=',19)
  3437. c213    FORMAT(' SET PHYS LOC. ROW =')
  3438. c    rewind 11
  3439.     If(lllv.ne.11)READ(LLLV,212,END=700,ERR=700)KKK
  3440.     if(lllv.eq.11)call Vgeti(kkk)
  3441. c    rewind 11
  3442.     KKK=KKK+1
  3443. 216    KK=MAX0(1,KK)
  3444.     KKK=MAX0(1,KKK)
  3445.     KK=MIN0(MCOLS,KK)
  3446.     KKK=MIN0(MROWS,KKK)
  3447. C CLAMP TO LEGAL SIZE
  3448.     PROW=KK
  3449.     PCOL=KKK
  3450. C
  3451.     RETURN
  3452. C TERMINAL READ ERROR AND END PROCESSING
  3453. 700    CONTINUE
  3454. c    IF(LEVEL.EQ.1)CLOSE(11)
  3455. c    IF(LEVEL.EQ.1)OPEN(11,FILE='CON:20/100/300/40/Analy Command')
  3456.     IF(LEVEL.NE.1)REWIND LEVEL
  3457.     IF(ITCNTV(LEVEL).EQ.0)GOTO 55
  3458.     IF(ZNEG(ITCNTV(LEVEL)).EQ.1)GOTO 55
  3459.     RETURN
  3460. 7000    CONTINUE
  3461.     IF(I.NE.2)GOTO 7200
  3462. C *W COMMANDS
  3463. C    IRX=(PCOL-1)*60+PROW
  3464.     CALL REFLEC(PCOL,PROW,IRX)
  3465.     CALL WRKFIL(IRX,WRK,0)
  3466. C    READ(7'IRX)WRK
  3467. C GET RECORD INTO MEMORY
  3468.     IF(LINE(3).EQ.'F')GOTO 224
  3469.     WRITE(CWRK(1:35),221)XAC
  3470. C    ENCODE(35,221,WRK)XAC
  3471. C PUT VARIABLE VALUE AS STRING INTO FILE BUFFER
  3472. 221    FORMAT(D32.25)
  3473.     GOTO 225
  3474. 224    CONTINUE
  3475. C WRITE AND USE LOCAL FORMAT
  3476.     WRK2(1)='('
  3477.     DO 226 K=1,9
  3478.     WRK2(1+K)=WRK(119+K)
  3479. 226    CONTINUE
  3480.     WRK2(11)=')'
  3481.     WRITE(CWRK(1:35),WRK2B)XAC
  3482. 225    CONTINUE
  3483.     DO 222 K=36,110
  3484. 222    WRK(K)=CHAR(32)
  3485.     CALL WRKFIL(IRX,WRK,1)
  3486. C    WRITE(7'IRX)WRK
  3487.     RETURN
  3488. 7200    CONTINUE
  3489.     IF(I.NE.3)GOTO 7400
  3490. C *G COMMANDS
  3491.     L1=3
  3492.     L2=60
  3493.     CALL VARSCN(LINE,L1,L2,LSTCH,ID1A,ID2A,IVLD1)
  3494.     IF(IVLD1.EQ.0)GOTO 1000
  3495.     CALL TYPGET(ID1A,ID2A,TYPE(1,1))
  3496.     IF(TYPE(1,1).EQ.2)GOTO 251
  3497.     CALL JVBLGT(1,ID1A,ID2A,JVBLS(1,1,1))
  3498.     LCL=JVBLS(1,1,1)
  3499.     GOTO 252
  3500. 251    CALL XVBLGT(ID1A,ID2A,XVBLS(1,1))
  3501.     LCL=XVBLS(1,1)
  3502. 252    CONTINUE
  3503. C NOW HAVE COLUMN NUMBER. PASS DELIMITER (WHATEVER IT IS) AND GO ON
  3504.     L1=LSTCH+1
  3505.     L2=60
  3506. C ASSUME WE GET THERE WITHIN 60 CHARACTERS...
  3507.     CALL VARSCN(LINE,L1,L2,LSTCH,ID1B,ID2B,IVLD2)
  3508.     IF(IVLD2.EQ.0)GOTO 1000
  3509. C SEEMS LIKE OK VARIABLE... GO AHEAD
  3510.     CALL JVBLGT(1,ID1B,ID2B,JVBLS(1,1,1))
  3511.     CALL TYPGET(ID1B,ID2B,TYPE(1,1))
  3512.     LRW=JVBLS(1,1,1)
  3513.     IF(TYPE(1,1).EQ.2)CALL XVBLGT(ID1B,ID2B,XVBLS(1,1))
  3514.     IF(TYPE(1,1).EQ.2)LRW=XVBLS(1,1)
  3515. C ADJUST FOR ACCUMULATOR ROW BY ADDING 1
  3516.     LRW=LRW+1
  3517. C NOW HAVE COLUMN AND ROW NUMBERS. GET VARIABLE USING THEM AFTER
  3518. C CLAMPING TO MAX VALUES.
  3519.     LCL=MAX0(1,LCL)
  3520.     LRW=MAX0(1,LRW)
  3521.     LCL=MIN0(LCL,MCOLS)
  3522.     LRW=MIN0(LRW,MROWS)
  3523. C RETURN VALUE.
  3524.     CALL TYPGET(LCL,LRW,TYPE(1,1))
  3525.     IF(TYPE(1,1).EQ.2)CALL XVBLGT(LCL,LRW,XAC)
  3526.     IF(TYPE(1,1).NE.2)CALL JVBLGT(1,LCL,LRW,JVBLS(1,1,1))
  3527.     IF(TYPE(1,1).NE.2)XAC=JVBLS(1,1,1)
  3528. C USE IMPLICIT CONVERSION FROM FORTRAN HERE. NOTE WE RETURN WITH
  3529. C THE LOOKED UP VALUE IN XAC.
  3530.     RETURN
  3531. 7400    CONTINUE
  3532.     IF(I.NE.4)GOTO 7600
  3533. C *Q COMMANDS
  3534. C *Q QUERY DATABASE COMMAND
  3535. C
  3536. C
  3537. C THIS COMMAND IS DESIGNED TO PERMIT CALC TO ACCESS SEQUENTIAL (FOR NOW)
  3538. C FILES AND PULL IN VALUES. ARRAY WRK IS USED TO HOLD THE RECORDS AND
  3539. C MAY DISPLAY WHATEVER IS DESIRED.
  3540. C
  3541. C OPERATION IS AS FOLLOWS:
  3542. C
  3543. C *QW/F filespec ?KEYSTRING? <cc>
  3544. C WHERE THE W/F FLAG MEANS WRITE TO FORMULA AT CURRENT LOC (MAYBE MODIFIED
  3545. C EARLIER BY THE *P COMMAND) AND F FLAG MEANS RETURN % AS VALUE OBTAINED BY
  3546. C ATTEMPTING A DECODE ON THE FILE LINE BETWEEN DELIMITER CHARACTERS
  3547. C cc GIVEN INSIDE  CHARACTERS. FILE IS ASSUMED TO START WITH
  3548. C "KEYSTRING" WHERE ANY CHARACTER IS A MATCH EXACTLY EXCEPT THAT
  3549. C THE _ CHARACTER INDICATES A WILDCARD.
  3550. C SPECIAL CASES:
  3551. C  IF ` IS 1ST CHAR OF KEYSTRING, RECORDS MUST HAVE KEYSTRING STARTING
  3552. C AT COL 1 (EXCLUDING THE `)
  3553. C  IF <CC> STRING HAS ` AS 1ST CHARACTER, THEN IT IS OF FORM
  3554. C <`NM> WHERE N=ASCII CODE FOR COLUMN WANTED + 32 AND M = ASCII CODE
  3555. C   FOR LENGTH DESIRED + 32
  3556. C  THIS ALLOWS POSITIONAL RETRIEVAL (THOUGH PAINFULLY)
  3557. C
  3558. C A SECOND KEYSTRING MAY BE ENTERED INSIDE A SECOND PAIR OF ? CHARACTERS TOO.
  3559. C  THE SEARCH WILL SEEK THE KEYS ANYWHERE IN THE RECORDS READ, UP TO 128
  3560. C  CHARACTERS LONG EACH.
  3561. C SECOND KEYSTRING MAY NOT BE ANCHORED TO START OF LINE.
  3562. C  AS AN ADDED ATTRACTION:
  3563. C   *QFK  OR *QFN  WON'T CLOSE LUN 4 AT END. IN ADDITION *QFN WON'T
  3564. C  CLOSE IT AT START EITHER ALLOWING SEQUENTIAL RETRIEVALS OUT OF
  3565. C  DATA FILES. DITTO *QW VARIANTS.
  3566. C    IRX=(PCOL-1)*60+PROW
  3567.     CALL REFLEC(PCOL,PROW,IRX)
  3568. C    IF(LINE(3).EQ.'W')READ(7'IRX)WRK
  3569.     IF(LINE(3).EQ.'W')CALL WRKFIL(IRX,WRK,0)
  3570.     IF(LINE(3).NE.'W'.AND.LINE(3).NE.'F')RETURN
  3571.     IL=INDX(LINE,32)
  3572.     IF(IL.GT.40)GOTO 299
  3573.     IL2=INDX(LINE(IL+1),32)
  3574.     IF(IL2.GT.38)GOTO 299
  3575. C ENSURE LUN 4 AVAILABLE
  3576.     IF(LINE(4).NE.'C'.AND.LINE(4).NE.'N')CLOSE(4)
  3577.     LINE(IL2+IL)=CHAR(0)
  3578.     IF(LINE(4).NE.'N'.AND.LINE(4).NE.'C')
  3579.      1   CALL RASSIG(4,LINE(IL+1))
  3580. C THIS MAKES LUN 4 BE THE ONE WE WANT
  3581.     LINE(IL2+IL)=CHAR(32)
  3582.     KKK=ICHAR('?')
  3583.     IQ1=INDX(LINE,KKK)
  3584. C LOCATE THE KEY
  3585.     IF(IQ1.GE.70)GOTO 299
  3586.     KKK=ICHAR('?')
  3587.     IQ2=INDX(LINE(IQ1+1),KKK)
  3588.     IF(IQ2.GE.72)GOTO 299
  3589. C NOW KNOW KEY IS IQ2-1 LONG, STARTS AT IQ1+1
  3590. C
  3591. C ALLOW DOUBLE KEYS IF ANOTHER ?? PAIR IS SEEN.
  3592.     KEYS2=0
  3593.     KKK=ICHAR('?')
  3594.     IQ3=INDX(LINE(IQ1+IQ2+1),KKK)
  3595.     IF(IQ3.GT.3)GOTO 297
  3596. C WELL, THERE'S A 2ND STRING THERE MAYBE.
  3597.     IQ4=INDX(LINE(IQ3+IQ1+IQ2+1),KKK)
  3598.     IF(IQ4.GT.30)GOTO 297
  3599.     IF(IQ4.EQ.1)GOTO 297
  3600.     KEYS2=1
  3601. C FLAG WE HAVE A SECOND KEY. SOMETHING'S THERE.
  3602.     LCL=IQ3+IQ2+IQ1+1
  3603.     LRW=LCL+IQ4-1
  3604. 297    READ(4,332,END=299,ERR=299)WRK2
  3605.     IQQ=IQ2-1
  3606.     IXX=128-IQ2
  3607. C COMPARE THE ENTIRE RECORD FOR THE KEY, MATCH ANYWHERE.
  3608.     IF(LINE(IQ1+1).NE.'`')GOTO 376
  3609. C IF 1ST CHAR OF KEY IS ` THEN SEARCH BEGINS AT LINE START ONLY. KEY IS
  3610. C 1 LESS.
  3611.     IQ1=1+IQ1
  3612.     IXX=1
  3613.     IQQ=IQQ-1
  3614. C ADJUST SO SEARCH IS 1 CHAR LESS.
  3615. 376    CONTINUE
  3616.     DO 350 KKK=1,IXX
  3617.     CALL SCMP(LINE(IQ1+1),WRK2(KKK),IQQ,ICOD)
  3618.     IF(ICOD.NE.0)GOTO 351
  3619. 350    CONTINUE
  3620. C DON'T JUST FALL THRU
  3621.     GOTO 353
  3622. 351    CONTINUE
  3623.     IF(KEYS2.EQ.0)GOTO 353
  3624. C CHECK SECOND KEY STRING IN RECORD IF ANY WAS ASKED FOR.
  3625. C (THAT'S ALL YOU GET. 2 KEYS MAX.)
  3626. C LINE(LCL) TO LINE(LRW) CONTAINS KEY.
  3627.     IXY=128-IQ4+1
  3628.     ICC=IQ4-1
  3629.     DO 354 KKK=1,IXY
  3630.     CALL SCMP(LINE(LCL),WRK2(KKK),ICC,ICOD)
  3631.     IF(ICOD.NE.0)GOTO 355
  3632. 354    CONTINUE
  3633. 355    CONTINUE
  3634. 353    IF(ICOD.EQ.0)GOTO 297
  3635. C HERE FOUND THE KEYED RECORD. NOW EXAMINE COMMAND LINE FOR
  3636. C SPECIAL CHARACTERS. IF NONE, JUST COPY THE FIRST CHARACTERS
  3637. C IN THE TEXT INTO EITHER THE BUFFER OR ENCODE THEM.
  3638.     KKK=ICHAR('<')
  3639.     IQ1=INDX(LINE,KKK)
  3640.     IF(IQ1.LE.0.OR.IQ1.GT.75)GOTO 296
  3641.     KKK=ICHAR('>')
  3642.     IQ2=INDX(LINE(IQ1+1),KKK)
  3643.     IF(IQ2.LE.0.OR.IQ2.GT.8)GOTO 296
  3644.     KKQ=ICHAR(LINE(IQ1+1))
  3645.     KK=INDX(WRK2,KKQ)
  3646. C MUNGE THE SEARCH SO THAT IF THE SPECIAL CHAR IS ` THEN THE NEXT 2
  3647. C CHARACTERS HAVE START AND LENGTH ENCODED AS ASCII CODE -32 DECIMAL
  3648. C WHICH ALLOWS FIELDS TO BE PLACED ANYWHERE (THOUGH SOMEWHAT PAINFULLY)
  3649.     IF(LINE(IQ1+1).EQ.'`')KK=ICHAR(LINE(IQ1+2))-32
  3650.     IF(KK.GT.125)GOTO 299
  3651. C NOTE THAT THE KEY FORM WOULD THEN GIVE
  3652. C  <`!@> FOR START COLUMN=1 AND LENGTH =32 (ASCII 64 = @ AND ASCII 33 = !)
  3653. C THIS MEANS USER HAS TO KNOW ASCII ORDER BUT AT LEAST IT'S IN MANUAL.
  3654.     IF(LINE(IQ1+1).EQ.'`')KKK=ICHAR(LINE(IQ1+3))-32
  3655.     KKQ=ICHAR(LINE(IQ1+2))
  3656.     IF(LINE(IQ1+1).NE.'`')KKK=INDX(WRK2(KK+1),KKQ)+KK
  3657.     GOTO 295
  3658. 296    CONTINUE
  3659. C DEFAULT, NO SPECIAL CHARS.
  3660.     KK=0
  3661.     KKK=110
  3662. 295    CONTINUE
  3663.     KL=KKK-KK-1
  3664.     KK=KK+1
  3665.     IF(LINE(3).NE.'W')GOTO 294
  3666.     KL=MIN0(KL,109)
  3667.     DO 293 N=1,KL
  3668.     WRK(N)=WRK2(KK)
  3669. 293    KK=KK+1
  3670.     WRK(KL+1)=0
  3671. C WRITE OUT THE RECORD'S KEY PART INTO SHEET FILE
  3672.     CALL WRKFIL(IRX,WRK,1)
  3673. C    WRITE(7'IRX)WRK
  3674.     XAC=1.
  3675.     GOTO 298
  3676. 294    CONTINUE
  3677. C FLOAT THE VALUE, RETURN IN XAC
  3678.     DO 750 N=1,35
  3679.     WRK(N)=CHAR(32)
  3680.     IF(N.LE.KL)WRK(N)=WRK2(KK-1+N)
  3681. 750    CONTINUE
  3682.     READ(CWRK(1:35),221,ERR=299)XAC
  3683. C    DECODE(KL,221,WRK2(KK),ERR=299)XAC
  3684. 298    CONTINUE
  3685. C IF IT'S A KEEP OR NEXT TYPE OPERATION, LEAVE LUN 4 OPEN.
  3686. C FIRST ONE MUST BE A KEEP (TO OPEN FILE IN THE FIRST PLACE)
  3687. C AND SUBSEQUENT OPERATIONS MAY BE A N OPERATIONS, WHICH
  3688. C WILL JUST CONTINUE SEQUENTIAL READIN OF DATA. USER HAS TO
  3689. C KEEP TRACK. NOTE RETURN VALUE IS -999999. (6 9'S) IF WE
  3690. C FAIL AND HAVE TO CLOSE FILE.
  3691.     IF(LINE(4).EQ.'K'.OR.LINE(4).EQ.'N')RETURN
  3692.     CLOSE(4)
  3693.     RETURN
  3694. 299    CONTINUE
  3695. C RETURN -999999 IF WE FAIL IN FINDING FILE.
  3696.     XAC=-999999.
  3697.     CLOSE(4)
  3698. C    COME HERE FOR NON-RECOVERABLE ERRORS IN FORMAT TOO.
  3699. C
  3700.     RETURN
  3701. 7600    CONTINUE
  3702.     IF(I.NE.5)GOTO 7800
  3703. C *F COMMANDS
  3704.     IF(XAC.LE.0)RETURN
  3705.     REWIND IOLVL
  3706.     IF(IOLVL.EQ.11)RETURN
  3707. 333    READ(IOLVL,332,END=331,ERR=331)WRK
  3708. 332    FORMAT(128A1)
  3709.     IF(WRK(1).NE.'*'.OR.WRK(2).NE.'C')GOTO 333
  3710.     ISSL=2
  3711.     ISSS=2
  3712.     IF(LINE(3).EQ.' ')ISSL=3
  3713.     IF(WRK(3).EQ.' ')ISSS=3
  3714.     CALL SCMP(LINE(ISSL),WRK(ISSS),80,ICODE)
  3715.     IF(ICODE.EQ.0)GOTO 333
  3716.     RETURN
  3717. C ERROR ENTRY WHERE WE SEE WE FAILED TO FIND LABEL.
  3718. 331    CONTINUE
  3719.     IF(IOLVL.NE.11)CLOSE(IOLVL)
  3720.     IOLVL=11
  3721.     RETCD=2
  3722. C
  3723.     RETURN
  3724. 7800    CONTINUE
  3725.     IF(I.NE.6)GOTO 8000
  3726. C *G
  3727.     IF(LEVEL.EQ.1.OR.XAC.LE.0)RETURN
  3728.     REWIND LEVEL
  3729. 363    READ(LEVEL,362,END=55,ERR=55)WRK
  3730. 362    FORMAT(128A1)
  3731.     IF(WRK(1).NE.'*'.OR.WRK(2).NE.'C')GOTO 363
  3732.     ISSL=2
  3733.     ISSS=2
  3734.     IF(LINE(3).EQ.' ')ISSL=3
  3735.     IF(WRK(3).EQ.' ')ISSS=3
  3736.     CALL SCMP(LINE(ISSL),WRK(ISSS),80,ICODE)
  3737.     IF(ICODE.EQ.0)GOTO 363
  3738. C
  3739.     RETURN
  3740. 8000    CONTINUE
  3741.     IF(I.NE.7)GOTO 8200
  3742. C *X COMMANDS
  3743. C NOW GET THE ARGS
  3744.     JFFG=0
  3745.     IF(LINE(3).EQ.'F')JFFG=1
  3746. C NOW HAVE FORMULA FLAG.
  3747.     IQ3=4
  3748. C ALLOW 1 SPACE OPTIONALLY
  3749.     IF(LINE(IQ3).EQ.' ')IQ3=5
  3750.     IQ1=INDX(LINE(IQ3),32)
  3751.     IQ1=IQ1+IQ3-1
  3752. C NULL TERMINATE FILENAME WHILE PARSING IT (DON'T LET ASSIGN SEE VBL NAME)
  3753.     LINE(IQ1)=0
  3754.     CLOSE(4)
  3755. 9770    CALL RASSIG(4,LINE(IQ3))
  3756. C REPLACE THE SPACE FOR VARSCN'S SIGHT
  3757.     LINE(IQ1)=CHAR(32)
  3758. C IQ1 NOW HAS START INDEX FOR VARSCN DESIRED... GO GET VRBL NAME.
  3759.     KK1=IQ1
  3760.     KK2=IQ1+20
  3761.     CALL VARSCN(LINE,KK1,KK2,KEK,KK,KKK,IVLD)
  3762.     IF(IVLD.LE.0)GOTO 481
  3763. C GOT VALID VARIABLE NAME. KK,KKK ARE ROW,COL
  3764. C NOW WE KNOW HOW TO RETRIEVE THE DATA OFF FILE IN UNIT 4
  3765. C READ INTO WRK ARRAY TILL WE GET IT.
  3766.     IQ3=KK
  3767.     IQ4=KKK-1
  3768. 483    READ(4,332,END=488,ERR=488)WRK
  3769. C IGNORE TITLE
  3770. 486    CONTINUE
  3771. C NOTE WE READ IN THE NUMBER IN NUMERIC FORMAT. EASIER THAT WAY.
  3772. c    IF(JFFG.EQ.0)READ(4,484,END=488,ERR=488)IRRW,ICCL,XYVAL
  3773. c    IF(JFFG.NE.0)READ(4,489,END=488,ERR=488)IRRW,ICCL,
  3774. c     1  (WRK(IV),IV=1,110)
  3775. c484    FORMAT(1X,I5,1X,I5,1X,E50.35)
  3776. c489    FORMAT(1X,I5,1X,I5,1X,110A1)
  3777.     READ(4,484,END=488,ERR=488)LETA,IRRW,ICCL,
  3778.      1  (WRK(IV),IV=1,110)
  3779. C ALWAYS READ TEXT AS ALPHA
  3780.     READ(CWRK50(1:50),6486,ERR=5486)XYVAL
  3781. C DECODE AND STORE IN XYVAL IF POSSIBLE
  3782. 6486    FORMAT(BN,D50.35)
  3783. 5486    CONTINUE
  3784. C HACK OUT TRAILING BLANKS
  3785.     DO 5322 IV=1,110
  3786.     IVV=111-IV
  3787.     IF(ICHAR(WRK(IVV)).GT.32)GOTO 5323
  3788.     WRK(IVV)=CHAR(0)
  3789. 5322    CONTINUE
  3790. 5323    CONTINUE
  3791. C &&&&
  3792. 484    FORMAT(1A1,I5,1X,I5,1X,110A1,50A1)
  3793.     READ(4,485,END=488,ERR=488)LFVLD,(WRK(IV),IV=120,128),KKTYP
  3794. C ALLOW FLAG OF 3 FOR NUMERIC,RECALCULATE... 2 FOR NUMERIC, NO RECALC.
  3795. C 1 CONTINUES TO MEAN ALWAYS RECALCULATE.
  3796.     IF(LFVLD.LT.-1)LFVLD=-3
  3797.     IF(LFVLD.GT.1)LFVLD=3
  3798. C
  3799. 485    FORMAT(I3,1X,9A1,1X,I5)
  3800. C READS IN AN ENTRY OF SAVED SHEET. TEST IF IN OUR RANGE.
  3801.     IF(IRRW.EQ.IQ3.AND.ICCL.EQ.IQ4)GOTO 487
  3802.     GOTO 486
  3803. 487    CONTINUE
  3804. C SUCCESS. NOW FILL IN VALUE OR FORMULA.
  3805.     IF(JFFG.EQ.0)GOTO 6487
  3806. C IF READING IN FORMULA, TRY AND GET VALUE OUT OF VALUE
  3807. C RECORD
  3808.     IF(LETA.NE.'p')GOTO 6487
  3809. C OK, THIS IS A VALUE RECORD WHICH SHOULD BE IMMEDIATELY FOLLOWED
  3810. C BY A FORMULA RECORD.
  3811. C   JUST DECODE THE VALUE AND RECORD IT.
  3812. C  ... ACTUALLY IT'S ALREADY DECODED SO JUST RECORD IT.
  3813.     CALL XVBLST(PROW,PCOL,XYVAL)
  3814.     XAC=XYVAL
  3815. C GO BACK AND GET FORMULA
  3816.     GOTO 486
  3817. 6487    CONTINUE
  3818. C    IRX=(PCOL-1)*60+PROW
  3819.     CALL REFLEC(PCOL,PROW,IRX)
  3820.     WRK(118)=CHAR(15)
  3821.     WRK(119)=CHAR(LFVLD)
  3822.     CALL FVLDST(PROW,PCOL,LFVLD)
  3823. C    FVLD(PROW,PCOL)=LFVLD
  3824. C SET UP TO SAVE FORMULA.
  3825. C SAVE EITHER FORMULA OR VALUE.
  3826.     IF(JFFG.EQ.0)GOTO 4890
  3827.     CALL CA2E(WRK,WRK2)
  3828.     CALL WRKFIL(IRX,WRK2,1)
  3829.     GOTO 488
  3830. 4890    CONTINUE
  3831. C SET UP NUMBER IF HERE.
  3832.     CALL TYPSET(PROW,PCOL,KKTYP)
  3833. C    TYPE(PROW,PCOL)=KKTYP
  3834.     CALL FVLDST(PROW,PCOL,LFVLD)
  3835. C    FVLD(PROW,PCOL)=LFVLD
  3836.     CALL XVBLST(PROW,PCOL,XYVAL)
  3837. C    XVBLS(PROW,PCOL)=XYVAL
  3838.     XAC=XYVAL
  3839. 488    CONTINUE
  3840.     CLOSE(4)
  3841.     RETURN
  3842. 481    CONTINUE
  3843.     CLOSE(4)
  3844.     RETCD=2
  3845. C
  3846.     RETURN
  3847. 8200    CONTINUE
  3848. 55    CLOSE(LEVEL)
  3849.     LEVEL=LEVEL-1
  3850. 1000    CONTINUE
  3851.     RETURN
  3852.     END
  3853. c -h- contyp.for    Fri Aug 22 13:00:17 1986    
  3854.     SUBROUTINE CONTYP (STACK,INDXX,OLDTYP,NEWTYP,RETCD)
  3855. C COPYRIGHT (C) 1983 GLENN EVERHART
  3856. C ALL RIGHTS RESERVED
  3857. C 60=MAX REAL ROWS
  3858. C 301=MAX REAL COLS
  3859. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  3860. C VBLS AND TYPE DIMENSIONED 60,301
  3861. C *                                                *
  3862. C *            SUBROUTINE CONTYP                   *
  3863. C
  3864. C
  3865. C  CONVERTS CONSTANT IN STACK(I,INDXX) FROM OLDTYP TO NEWTYP
  3866. C  IF OLDTYP.EQ.NEWTYP A RETURN IS MADE IMMEDIATELY.
  3867. C  NOTE THAT TYPE(INDXX) IS NOT CHANGED BY THIS ROUTINE
  3868. C  TYPE CODES:
  3869. C
  3870. C    0    NO CHANGE
  3871. C    1    ASCII
  3872. C    2    DECIMAL
  3873. C    3    HEXADECIMAL
  3874. C    4    INTEGER
  3875. c note: multiple precision conversions diked out
  3876. C    5    M10
  3877. C    6    M8
  3878. C    7    M16
  3879. C    8    OCTAL
  3880. C    9    REAL
  3881. C
  3882. C  RETCD    MEANING
  3883. C
  3884. C    1    O.K.
  3885. C    2    ERROR
  3886. C
  3887. C
  3888. C   MODIFY CLASSES:  M3,M4,M8
  3889. C
  3890. C  CONTYP CALLS:
  3891. C
  3892. C   ERRMSG   PRINTS OUT ERROR MESSAGES
  3893. C   MULCON   CONVERTS MULTIPLE PRECISION TO MULTIPLE PRECISION
  3894. C            OF A DIFFERENT BASE
  3895. C
  3896. C
  3897. C
  3898. C  CONTYP IS CALLED BY
  3899. C
  3900. C   CALUN    CALCULATES UNARY OPERATIONS
  3901. C   CALBIN   CALCULATES BINARY OPERATIONS
  3902. C   VARIABLE     USE
  3903. C
  3904. C  BASE        HOLDS BASE OR POWERS OF THAT BASE (INTEGER*4).
  3905. C  BASVEC      HOLDS LEGAL BASES: 8,10, AND 16
  3906. C  EIGHT(8)    CHARACTER*1 ARRAY TO PICK OFF REAL*8 VALUES.
  3907. C  FOUR(4)     CHARACTER*1 ARRAY TO PICK OFF INTEGER*4 VALUES.
  3908. C  I,J,M       TEMPORARY VALUES.
  3909. C  IBASE       HOLDS BASE OF A NUMBER WHEN BASE HOLDS THE POWERS
  3910. C              OF THAT BASE.
  3911. C  IEND        HOLDS THE NUMBER OF MULTIPLE PRECISION DIGITS THAT
  3912. C              WILL BE PICKED UP WHEN CONVERTING TO INTEGER*4.
  3913. C  INDXX       POINTER TO VARIABLE BEING CONVERTED.
  3914. C  INT         HOLDS INTEGER*4 VALUES EQUIVALENCED TO VECTOR FOUR.
  3915. C  IS          TEMPORARILY HOLDS MULTIPLE PRECISION BASE 8 OR BASE
  3916. C              16 DIGITS.
  3917. C  IS2         TEMPORARILY HOLDS A DIGIT VALUE WHEN CHECKING MULTIPLE
  3918. C              PRECISION BASE 8 AND BASE 16 NUMBERS TO SEE IF THEY
  3919. C              ARE TOO LARGE TO FIT IN INTEGER*4.
  3920. C  ISGN        USED WHEN DETERMINING THE MAXIMUM NUMBER THAT CAN BE
  3921. C              HELD BY INTEGER*4. 1=POSITIVE, 2= NEGATIVE. ALSO HOLDS
  3922. C              0 OR 7 FOR BASE 8 MAXIMUM NUMBER CHECK. HOLDS 0 OR 15
  3923. C              FOR BASE 16 MAXIMUM NUMBER CHECK.
  3924.  
  3925. C  K           TEMPORARILY HOLDS INTEGER*4 VALUES.
  3926. C  NEWTYP      NEW DATA TYPE REQUESTED.
  3927. C  OLDTYP      DATA TYPE OF THE VARIABLE TO BE CONVERTED.
  3928. C  RBASE       BASE WHEN CONVERTING FROM MULTIPLE PRECISION TO REAL*8.
  3929. C  REAL        HOLDS REAL*8 VALUES. EQUIVALENCED TO ARRAY EIGHT.
  3930. C  RETCD       RETURN CODE. 1=O.K.  2=ERROR.
  3931. C  RPOWER      HOLDS POWERS OF RBASE WHEN CONVERTING FROM MULTIPLE
  3932. C              PRECISION TO REAL*8.
  3933. C  STACK(I,INDXX)  HOLDS VARIABLE TO BE CONVERTED.
  3934. C
  3935. C
  3936. C    SUBROUTINE CONTYP (STACK,INDXX,OLDTYP,NEWTYP,RETCD)
  3937. C
  3938.     REAL*8 REAL,RBASE,RPOWER,DFLOAT
  3939. C
  3940.     INTEGER*4 K,INT,BASE
  3941. C
  3942.     InTeGer*4 OLDTYP,NEWTYP,RETCD,BASVEC(3),INDXX
  3943.     InTeGer*4 MAX10(10,2)
  3944.     InTeGer*4 I,M,J
  3945.     InTeGer*4 ISGN,IS,IS2
  3946. C
  3947.     CHARACTER*1 EIGHT(8),FOUR(4)
  3948.     CHARACTER*1 STACK(8,40)
  3949. C
  3950.     EQUIVALENCE (FOUR,INT),(REAL,EIGHT)
  3951. C
  3952.     DATA BASVEC/10,8,16/
  3953.     DATA MAX10/2,1,4,7,4,8,3,6,4,7,2,1,4,7,4,8,3,6,4,8/
  3954. C
  3955. C
  3956. C  SET DEFAULT RETURN CODE
  3957.     RETCD=1
  3958.     IF(OLDTYP.GT.0)GO TO 910
  3959. C
  3960. C VARIABLE UNDEFINED
  3961.     CALL ERRMSG(16)
  3962.     RETCD=2
  3963.     RETURN
  3964. C
  3965. C
  3966. C
  3967. 910    IF(NEWTYP.EQ.0) RETURN
  3968.     IF (OLDTYP.EQ.NEWTYP) RETURN
  3969.     GOTO (1000,2000,3000,3000,4000,5000,6000,3000,2000), OLDTYP
  3970.     STOP 1000
  3971. C
  3972. C
  3973. C
  3974. C **************************************************
  3975. C **************  OLDTYP = ASCII  ******************
  3976. C **************************************************
  3977. C
  3978. C  START BY CONVERTING TO INTEGER*4
  3979. 1000    CONTINUE
  3980. C
  3981. C
  3982. C  IF INTEGER, HEXADECIMAL OR OCTAL, ALMOST DONE
  3983.     DO 1002 I=2,8
  3984. 1002    STACK(I,INDXX)=0
  3985.     IF (NEWTYP.EQ.3.OR.NEWTYP.EQ.4.OR.NEWTYP.EQ.8) RETURN
  3986. C
  3987. C
  3988. C
  3989.     DO 1008 I=1,4
  3990. 1008    FOUR(I)=STACK(I,INDXX)
  3991.     IF (NEWTYP.EQ.2.OR.NEWTYP.EQ.9) GOTO 1200
  3992. C
  3993. C
  3994. C  MULTIPLE PRECISION
  3995. 1010    continue
  3996.     RETURN
  3997. C
  3998. C
  3999. C  DECIMAL OR REAL
  4000. 1200    REAL=DFLOAT(INT)
  4001.     DO 1210 I=1,8
  4002. 1210    STACK(I,INDXX)=EIGHT(I)
  4003.     RETURN
  4004. C
  4005. C
  4006. C
  4007. C **************************************************
  4008. C *********  OLDTYP = DECIMAL OR REAL  *************
  4009. C **************************************************
  4010. C
  4011. 2000    IF (NEWTYP.EQ.2.OR.NEWTYP.EQ.9) RETURN
  4012. C
  4013. C
  4014.     DO 2002 I=1,8
  4015. 2002    EIGHT(I)=STACK(I,INDXX)
  4016. C
  4017. C
  4018. C  ZERO STACK(I,INDXX)
  4019.     DO 2004 I=1,8
  4020. 2004    STACK(I,INDXX)=CHAR(0)
  4021. C
  4022. C
  4023. C  CONVERT TO INTEGER
  4024. C  MAKE SURE CONVERSION DOESN'T BLOW UP
  4025.     IF(REAL.LT.-2147483648.D0.OR.REAL.GT.2147483647.D0)
  4026.      1 GOTO 6050
  4027. C
  4028. C
  4029. C
  4030. 2007    INT=REAL
  4031. C
  4032. C SEE IF NEWTYP IS MULTIPLE PRECISION
  4033.     IF (NEWTYP.GE.5.AND.NEWTYP.LE.7) GOTO 1010
  4034.     DO 2008 I=1,4
  4035. 2008    STACK(I,INDXX)=FOUR(I)
  4036. C
  4037. C RETURN IF TYPE IS INTEGER, HEX, OR OCTAL
  4038.     IF (NEWTYP.EQ.3.OR.NEWTYP.EQ.4.OR.NEWTYP.EQ.8) RETURN
  4039. C
  4040. C ASCII SO CLEAR OUT BYES 2,3, AND 4
  4041. 2009    DO 2010 I=2,4
  4042. 2010    STACK(I,INDXX)=CHAR(0)
  4043.     RETURN
  4044. C
  4045. C
  4046. C
  4047. C
  4048. C
  4049. C
  4050. C **************************************************
  4051. C *******  OLDTYP = INTEGER, HEX, OR OCTAL  ********
  4052. C **************************************************
  4053. C
  4054. 3000    IF (NEWTYP.EQ.3.OR.NEWTYP.EQ.4.OR.NEWTYP.EQ.8) RETURN
  4055.     DO 3002 I=1,4
  4056. 3002    FOUR(I)=STACK(I,INDXX)
  4057. C
  4058. C SEE IF NEWTYP IS ASCII
  4059.     IF (NEWTYP.EQ.1) GOTO 2009
  4060. C
  4061. C IF NOT REAL*8 THEN IT IS MULTIPLE PRECISION (PROCESS AT 1010)
  4062.     IF (NEWTYP.NE.2.AND.NEWTYP.NE.9) GOTO 1010
  4063. C
  4064. C PROCESS AS REAL*8
  4065.     GOTO 1200
  4066. C
  4067. C *************  OLDTYP = M10  *********************
  4068. C
  4069. 4000    CONTINUE
  4070.     RETURN
  4071. 4040    continue
  4072.     RETURN
  4073. C
  4074. C **************  OLDTYP = M8  *********************
  4075. C
  4076. 5000    CONTINUE
  4077. C ***************  OLDTYP = M16  *******************
  4078. C
  4079. 6000    CONTINUE
  4080.     RETURN
  4081. C
  4082. C ***** ERROR RETURN ******
  4083. 6050    RETCD=2
  4084. C ILLEGAL CONVERSION ATTEMPTED.
  4085.     CALL ERRMSG(26)
  4086.     RETURN
  4087. C
  4088.     END
  4089. c -h- imask.for    Fri Aug 22 12:54:45 1986    
  4090.     INTEGER FUNCTION IMASK(I1,I2)
  4091.     InTeGer*4 I1,I2
  4092.     InTeGer*4 IXX
  4093.     IXX=I1.AND.I2
  4094.     IMASK=IXX
  4095.     RETURN
  4096.     END
  4097.     REAL*8 FUNCTION DFLOAT(IN)
  4098.     INTEGER IN
  4099.     REAL*8 XX
  4100.     XX=IN
  4101.     DFLOAT=XX
  4102.     RETURN
  4103.     END
  4104. C ********ANALYASM.FTN ##################################3
  4105. c AnalytiCalc Amiga specific terminal I/O routines.
  4106. c note ttyini is also special and opens console window...
  4107.     Subroutine SWRT(ibuf,isz)
  4108. c write isz bytes from ibuf onto console window
  4109.     Include dos.inc
  4110.     Integer*4 Isz,i
  4111.     Integer*4 Amiga
  4112.     External Amiga
  4113. C    common/consfh/fh
  4114.     CHARACTER*1 OARRY(100)
  4115.     InTeGer*4 OSWIT,OCNTR
  4116. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  4117. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  4118.     InTeGer*4 IPS1,IPS2,MODFLG
  4119. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  4120.        InTeGer*4 XTCFG,IPSET,XTNCNT
  4121.        CHARACTER*1 XTNCMD(80)
  4122. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  4123. C VARY FLAG ITERATION COUNT
  4124.     INTEGER KALKIT
  4125. C    COMMON/VARYIT/KALKIT
  4126.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  4127.     InTeGer*4 RCMODE,IRCE1,IRCE2
  4128. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  4129. C     1  IRCE2
  4130. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  4131. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  4132. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  4133. C RCFGX ON.
  4134. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  4135. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  4136. C  AND VM INHIBITS. (SETS TO 1).
  4137.     INTEGER*4 FH
  4138. C FILE HANDLE FOR CONSOLE I/O (RAW)
  4139. C    COMMON/CONSFH/FH
  4140.     CHARACTER*1 ARGSTR(52,4)
  4141. C    COMMON/ARGSTR/ARGSTR
  4142.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  4143.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  4144.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  4145.      3  IRCE2,FH,ARGSTR
  4146.     If(fh.ne.0)I=amiga(Write,fh,ibuf,isz)
  4147.     return
  4148.     end
  4149.     Subroutine ttyin(IIMODE,line)
  4150. c read 132 char line off console
  4151. C iimode=0 in Command-Mostly mode, 1 in Enter mostly mode.
  4152.     Integer*4 iact,n,IIMODE
  4153.     include dos.inc
  4154.     Integer*4 Amiga
  4155.     External Amiga
  4156. C    common/consfh/fh
  4157.     CHARACTER*1 OARRY(100)
  4158.     InTeGer*4 OSWIT,OCNTR
  4159. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  4160. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  4161.     InTeGer*4 IPS1,IPS2,MODFLG
  4162. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  4163.        InTeGer*4 XTCFG,IPSET,XTNCNT
  4164.        CHARACTER*1 XTNCMD(80)
  4165. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  4166. C VARY FLAG ITERATION COUNT
  4167.     INTEGER KALKIT
  4168. C    COMMON/VARYIT/KALKIT
  4169.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  4170.     InTeGer*4 RCMODE,IRCE1,IRCE2
  4171. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  4172. C     1  IRCE2
  4173. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  4174. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  4175. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  4176. C RCFGX ON.
  4177. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  4178. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  4179. C  AND VM INHIBITS. (SETS TO 1).
  4180.     INTEGER*4 FH
  4181.     Character*1 wrkchr,lstchr
  4182.     Integer*4 iescst
  4183. C FILE HANDLE FOR CONSOLE I/O (RAW)
  4184. C    COMMON/CONSFH/FH
  4185.     CHARACTER*1 ARGSTR(52,4)
  4186. C    COMMON/ARGSTR/ARGSTR
  4187.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  4188.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  4189.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  4190.      3  IRCE2,FH,ARGSTR
  4191.     character*1 line(132)
  4192.     InTeGer*4 RRWACT,RCLACT
  4193. C    COMMON/RCLACT/RRWACT,RCLACT
  4194.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  4195.      1  IDOL7,IDOL8
  4196. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  4197. C     1  IDOL7,IDOL8
  4198.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  4199. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  4200.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  4201. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  4202. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  4203. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  4204.     InTeGer*4 KLVL
  4205. C    COMMON/KLVL/KLVL
  4206.     InTeGer*4 IOLVL,IGOLD
  4207. C    COMMON/IOLVL/IOLVL
  4208. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  4209. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  4210.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  4211.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  4212.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  4213.      3  k3dfg,kcdelt,krdelt,kpag
  4214. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  4215. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  4216. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  4217.     Integer*4 Kone
  4218.     Character*1 xlf
  4219. CCC    InTeGer*4 LLCMD,LLDSP
  4220. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  4221. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  4222.     xlf=char(10)
  4223.     iescst=0
  4224.     Kone=1
  4225.     wrkchr=char(0)
  4226. c initially, no ESC seen
  4227. c Set up to read raw: device OK.
  4228. c If we see an ESC character then look for either a return
  4229. c (to terminate in any case) or some character whose value is
  4230. c greater than 64. However ESC O will be passed and the scan will
  4231. c continue.
  4232. C implement deletion of last character also with DEL or with
  4233. C backspace keys
  4234. c
  4235. c Initially zero entire buffer so we later can find length via looking
  4236. c for anything non-zero. Also serves to put in terminators for things
  4237. c like the INDX function to prevent them from running on indefinitely.
  4238.     do 1 n=1,132
  4239. 1    line(n)=char(0)
  4240. c if mode 0, (command mostly) then / is NOT special
  4241.     if(fh.eq.0)goto 1000
  4242. c Here begin the read loop
  4243.     n=1
  4244. 4000    continue
  4245.     lstchr=wrkchr
  4246.     wrkchr=char(0)
  4247. C zero wrkchr for safety
  4248.     iact=amiga(Read,fh,wrkchr,Kone)
  4249.     If(Iact.le.0)goto 4000
  4250.     If(ichar(wrkchr).eq.0)goto 4000
  4251. CCC Add this to just read the line
  4252. CC    iact=amiga(Read,fh,line,132)
  4253. 4050    Continue
  4254.     If(ichar(wrkchr).ne.8.and.ichar(wrkchr).ne.127)goto 4100
  4255. C back up a character and try again
  4256. c Last char was backspace or DEL, so back up by one, echo backspace.
  4257.     n=max0(1,(n-1))
  4258.     lstchr=char(8)
  4259. C echo a backspace
  4260. C 8 is ASCII backspace...
  4261.     ii=Amiga(Write,fh,Lstchr,Kone)
  4262.     Goto 4000
  4263. 4100    Continue
  4264. c C.R. is 13, LF is 10, FF is 14, so terminate on any of these
  4265. c traditional line terminators.
  4266.     If(ichar(wrkchr).lt.16)goto 5000
  4267. c Normal character, just echo it.
  4268.     ii=Amiga(Write,fh,wrkchr,kone)
  4269. c echo the character back
  4270. c Then store it.
  4271.     line(n)=wrkchr
  4272.     n=min0(n+1,131)
  4273.     if(ichar(wrkchr).eq.27.or.ichar(Wrkchr).eq.155)iescst=1
  4274. c <ESC>O is actually an escape sequence initiator
  4275.     If(iescst.eq.1.and.wrkchr.eq.'O'.and.ichar(lstchr)
  4276.      1  .eq.27) goto 4200
  4277. c Otherwise an escape sequence ends in a letter
  4278.     If(Iescst.eq.0)goto 4200
  4279.     ii=ichar(wrkchr)
  4280.     If(ii.eq.91)goto 4200
  4281. c 91 is ascii for [
  4282.     If(ii.gt.64.and.ii.lt.127)Return
  4283. C terminate read at end of any escape sequence
  4284. c from A to z except [ are possible esc seq delimiters.
  4285. 4200    Continue
  4286. c The above condition terminates an ESC sequence after ESC and any other
  4287. c characters followed by (and including) any character greater than 'A'
  4288. c which should take care of just about every ANSI escape sequence.
  4289.     if(n.lt.131)goto 4000
  4290. c Terminate even if we never get C.R. but not 'till we've got
  4291. c all there is to get...
  4292.     Return
  4293. 5000    continue
  4294. c Echo line terminator
  4295.     line(n)=wrkchr
  4296.     ii=Amiga(Write,fh,wrkchr,kone)
  4297.     If(ichar(wrkchr).eq.13)ii=Amiga(Write,fh,xlf,Kone)
  4298. c echo lf after cr
  4299. c done reading now.
  4300.     Return
  4301. 1000    Continue
  4302. C fakeout fallback position, reading workbench window
  4303.     Read(*,1500)line
  4304. 1500    format(132a1)
  4305.     return
  4306.     end
  4307.     subroutine swset(i)
  4308.     integer*4 i
  4309. c dummy setup sub
  4310.     return
  4311.     end
  4312.     subroutine exitqq
  4313. c exit routine ... just do fortran stop to make it complete
  4314.     stop "AnalytiCalc exiting..."
  4315.     end
  4316.     subroutine system(line)
  4317.     include dos.inc
  4318. c execute an amigados command
  4319.     integer*4 inp,outp
  4320.     character*80 line
  4321.     character*80 l2
  4322.     logical*4 succ
  4323.     Logical*4 Amiga
  4324.     External Amiga
  4325.     do 1 n=1,79
  4326.     m=81-n
  4327. c space is ascii code 32
  4328. c look for trailing whitespace to remove
  4329.     if(ichar(line(m:m)).gt.32)goto 2
  4330. 1    continue
  4331. 2    n=m
  4332. c n= last character of non-null
  4333.     k=1
  4334.     if((line(1:1).eq.'$').or.(line(1:1).eq.'}'))k=2
  4335.     open(unit=2,file='ram:AnalyJnk.Tmp',status='new')
  4336.     write(2,1000)line(k:n)
  4337.     if(line(1:1).eq.'$')write(2,1001)
  4338. 1000    format(A)
  4339. 1001    Format('EndCLI')
  4340.     close(unit=2)
  4341.     inp=0
  4342.     outp=0
  4343.     if(line(1:1).eq.'$')l2=
  4344.      1  'NEWCLI CON:0/0/600/190/ASpwn FROM ram:AnalyJnk.Tmp'
  4345.      2  // char(0)
  4346.     if(line(1:1).ne.'$')l2=
  4347.      1  'NEWSHELL CON:0/0/600/190/ASpwn FROM ram:AnalyJnk.Tmp'
  4348.      2  // char(0)
  4349.     succ=amiga(Execute,l2,
  4350.      2  inp,outp)
  4351.     return
  4352.     end
  4353. C ************ AnalyDM.Ftn ######################################
  4354. c -h- declr.for    Fri Aug 22 13:02:54 1986    
  4355.     SUBROUTINE DECLR(ITYP,RETCD)
  4356. C COPYRIGHT (C) 1983 GLENN EVERHART
  4357. C ALL RIGHTS RESERVED
  4358. C 60=MAX REAL ROWS
  4359. C 301=MAX REAL COLS
  4360. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  4361. C VBLS AND TYPE DIMENSIONED 60,301
  4362. C **************************************************
  4363. C *                                                *
  4364. C *       SUBROUTINE  DECLR (ITYP,RETCD)           *
  4365. C *                                                *
  4366. C **************************************************
  4367. C
  4368. C
  4369. C ANALYZES VECTOR LINE TO DETERMINE WHAT VARIABLES GET THEIR
  4370. C TYPES CHANGED. THE NEW TYPE IS SPECIFIED AS AN ARGUMENT IN
  4371. C THE CALL:
  4372. C
  4373. C
  4374. C  TYPE CODE
  4375. C    1  ASCII
  4376. C    2  DECIMAL (REAL BUT DECIMAL POINT FOR OUTPUT)
  4377. C    3  HEXADECIMAL
  4378. C    4  INTEGER
  4379. C    5  MULTIPLE PRECISION (BASE 10)
  4380. C    6  MULTIPLE PRECISION (BASE 8)
  4381. C    7  MULTIPLE PRECISION (BASE 16)
  4382. C    8  OCTAL
  4383. C    9  REAL
  4384. C
  4385. C  IF NEGATIVE, TYPE IS DEFINED BUT VARIABLE HAS
  4386. C  NOT BEEN ASSIGNED A VALUE
  4387. C
  4388. C
  4389. C  RETCD     MEANING
  4390. C  1    =    O.K.
  4391. C  2    =    ERROR
  4392. C
  4393. C  NOTE:  AS IN FORTRAN, VARIABLES IN DECLARATIONS MUST BE SEPARATED
  4394. C         BY COMMAS
  4395. C
  4396. C
  4397. C  MODIFICATION CLASSES: M1, M2
  4398. C
  4399. C
  4400. C
  4401. C
  4402. C DECLR CALLS:
  4403. C
  4404. C  ERRMSG   PRINTS ERROR MESSAGES
  4405. C
  4406. C
  4407. C
  4408. C DECLR IS CALLED BY CMND, THE ROUTINE THAT DECODES COMMANDS.
  4409. C
  4410. C
  4411. C
  4412. C
  4413. C       VARIABLE        USE
  4414. C
  4415. C    ALPHA           LIST OF LEGAL VARIABLE NAMES. THE FIRST 26 ARE
  4416. C                    ALPHABETIC, THE 27TH IS THE CHARACTER '%'.
  4417. C    BLANK           ' '
  4418. C    I,I2,I3         TEMPORARY VALUES.
  4419. C    ITYP            CODE THAT GIVES THE TYPE OF VARIABLE FOR A
  4420. C                    PARTICULAR CALL TO THIS ROUTINE. VARIABLES ARE
  4421. C                    EITHER DECLARED TO BE OF THIS TYPE OR, IF NO
  4422. C                    VARIABLES ARE SPECIFIED, A LIST OF ALL THE
  4423. C                    VARIABLES OF THAT TYPE ARE GIVEN.
  4424. C    LEND            LAST NON-BLANK IN VECTOR LINE(80).
  4425. C    LINE(80)        HOLDS INPUT COMMAND LINE. IF DECLARATION HAS
  4426. C                    NO ARGUMENT, THIS VECTOR IS THEN USED TO OUTPUT
  4427. C                    A LIST OF VARIABLES OF THE TYPE SPECIFIED.
  4428. C    NONBLK          START SCAN OF VARIABLE LIST.
  4429. C    TYPE            HOLDS THE TYPE CODE FOR EACH VARIABLE.
  4430. C
  4431. C
  4432. C
  4433. C
  4434. C
  4435. C
  4436. C
  4437. C    SUBROUTINE DECLR(ITYP,RETCD)
  4438.     InTeGer*4 LEVEL,NONBLK,LEND
  4439.     InTeGer*4  RETCD,VIEWSW,BASED,VLEN(9)
  4440.     InTeGer*4 TYPE(1,1)
  4441.     InTeGer*4 I,I2,I3,ITYP
  4442. C
  4443.     CHARACTER*1  LINE(80),AVBLS(20,27),VBLS(8,1,1)
  4444.     CHARACTER*1 ALPHA(27),COMMA,BLANK,RPAR,LPAR,EQ
  4445.     Character*127 cwrk
  4446. C
  4447.     COMMON  /V/TYPE,AVBLS,VBLS,VLEN
  4448.     COMMON  /CONS/ALPHA,COMMA,BLANK,RPAR,LPAR,EQ
  4449.     COMMON LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  4450. C
  4451. C
  4452. C
  4453.     IF(NONBLK.EQ.LEND)GO TO 500
  4454. C
  4455. C
  4456. C **************************************************
  4457. C ****** DECLARE VARIABLES TO BE OF TYPE ITYP ******
  4458. C **************************************************
  4459.     I2=NONBLK+1
  4460. 10    CONTINUE
  4461. C10    IF (LINE(I2).EQ.BLANK) GOTO 60
  4462. C    DO 20 I3=1,26
  4463. C    IF (LINE(I2).EQ.ALPHA(I3)) GOTO 30
  4464. C20    CONTINUE
  4465. C *****&&&&& ADD VARIABLE SIZE SUPPORT - GCE
  4466.     CALL VARSCN(LINE,I2,LEND,LSTCHR,ID1,ID2,IVALID)
  4467. C VARSCN SEARCHES FOR VALID VARIABLE NAME STRINGS INCLUDING C$+EXPR
  4468. C AND R$+EXPR FOR LOC-RELATIVE NAMES IN ABSOLUTE AND C@+N, R@+N FOR RELATIVE
  4469. C NAMES IN DISPLAY SYSTEM. IT RETURNS THE ID1, ID2 INDICES FOR
  4470. C THE VARIABLES IN VBLS ARRAY AND TYPE ARRAY. FOR SINGLE ALPHAS
  4471. C A-Z, ID1 RETURNS 1-26 AND ID2=1. % RETURNS ID1=27, ID2=1.
  4472.     IF(IVALID.EQ.0) GOTO 22
  4473. C VALID FLAG IS NONZERO IF VARIABLE NAME IS VALID, ELSE 0.
  4474.     I2=LSTCHR
  4475. C LSTCHR RETURNS LAST CHARACTER OF NAME
  4476.     GOTO 30
  4477. C
  4478. C  ILLEGAL CHARACTER IN DECLARATION'S VARIABLE LIST
  4479. 22    I=4
  4480. C
  4481. C
  4482. C
  4483. C ******* ERROR RETURN *******
  4484. 25    RETCD=2
  4485.     CALL ERRMSG(I)
  4486.     RETURN
  4487. C
  4488. C
  4489. C
  4490. C
  4491. 30    CONTINUE
  4492. C IF OLD VARIABLE WAS UNDEFINED, MAKE NEW TYPE LESS THAN 0 ALSO.
  4493. C THIS ALLOWS ONE TO EXAMINE INTERNAL VALUES FOR DIFFERENT DATA
  4494. C TYPES. IF THIS IS NOT NEEDED, IT WOULD BE CLEANER TO ALWAYS MAKE
  4495. C VARIABLES UNDEFINED WHEN THEIR DATA TYPE IS CHANGED. TO DO THIS
  4496. C JUST USE THE STATEMENT
  4497. C    I=-ITYP
  4498.     I=ITYP
  4499. C ****&&&&&& NOTE TYPE NOW 2-DIM
  4500.     CALL TYPGET(ID1,ID2,TYPE(1,1))
  4501.     IF(TYPE(1,1).LE.0)I=-I
  4502.     CALL TYPSET(ID1,ID2,I)
  4503. C    TYPE(ID1,ID2)=I
  4504.     I3=I2+1
  4505.     IF (I3.GT.LEND) GOTO 1000
  4506.     DO 40 I2=I3,LEND
  4507.     IF (LINE(I2).EQ.BLANK) GOTO 40
  4508.     IF (LINE(I2).EQ.COMMA) GOTO 45
  4509. C
  4510. C VARIABLES NOT SEPARATED BY COMMAS
  4511.     I=5
  4512.     GO TO 25
  4513. 40    CONTINUE
  4514.     GOTO 1000
  4515. 45    IF (I2.EQ.LEND) GOTO 22
  4516. 60    I2=I2+1
  4517.     IF (I2.LE.LEND) GOTO 10
  4518.     GO TO 1000
  4519. C
  4520. C
  4521. C
  4522. C
  4523. C
  4524. C
  4525. C **********************************************************************
  4526. C ** NO ARGUMENTS SO SHOW WHAT VARIABLES HAVE BEEN DECLARED THAT TYPE **
  4527. C **********************************************************************
  4528. 500    CONTINUE
  4529.     IF(VIEWSW.EQ.0) GO TO 1000
  4530. C PERHAPS THE ABOVE LINE SHOULD BE REMOVED (???)
  4531. C
  4532. C
  4533. C BLANK OUT OUTPUT LINE.
  4534.     DO 510 I=1,80
  4535. 510    LINE(I)=BLANK
  4536. C
  4537. C
  4538. C SEARCH FOR VARIABLES OF TYPE ITYP. PUT THEM IN LINE(I2) WHEN FOUND FOR
  4539. C LATER PRINTING.
  4540.     I2=0
  4541.     DO 550 I=1,27
  4542. C FAKE UP DISPLAY
  4543. C ****&&&&&
  4544.     CALL TYPGET(I,1,TYPE(1,1))
  4545.     IF(IABS(TYPE(1,1)).NE.ITYP)GO TO 550
  4546.     I2=I2+1
  4547.     LINE(I2)=ALPHA(I)
  4548. 550    CONTINUE
  4549. C
  4550. C
  4551. C GO TO SECTION APPROPRIATE FOR PRINTING EITHER THE LIST OF VARIABLES OR
  4552. C A MESSAGE INDICATING THAT NO VARIABLES ARE OF THAT TYPE.
  4553.     IF(I2.EQ.0) GO TO 600
  4554. C
  4555. C
  4556. C OUTPUT A LIST OF VARIABLES OF TYPE ITYP
  4557.     write(cwrk,560)(line(i),i=1,i2)
  4558.     Call vwrt(char(13)//char(10),2)
  4559.     call vwrt('Variables so declared=',22)
  4560.     call vwrt(cwrk,i2)
  4561. c    WRITE(11,560) (LINE(I),I=1,I2)
  4562. 560    format(30a1)
  4563. c560    FORMAT(' VARIABLES SO DECLARED = ',30A1)
  4564.     GO TO 1000
  4565. C
  4566. C
  4567. C
  4568. C
  4569. C NO VARIABLES OF THAT TYPE
  4570. 600    Continue
  4571.     Call vwrt(char(13)//char(10),2)
  4572.     Call vwrt(' No variables of that type',26)
  4573. c600    WRITE(11,610)
  4574. 610    FORMAT(' NO VARIABLES OF THAT TYPE')
  4575. C
  4576. C
  4577. C
  4578. C **** NORMAL RETURN ****
  4579. 1000    RETCD=1
  4580.     RETURN
  4581.     END
  4582. c -h- doentr.for    Fri Aug 22 13:03:06 1986    
  4583.     SUBROUTINE DOENTR(FORM,LOW,LHIGH)
  4584. C +++++++++++++++++++++++++++++++++++
  4585. C PARAMETER 18060=60*301
  4586.     CHARACTER*1 FORM,FVLD,CMDLIN(132)
  4587.     INTEGER*4 VNLT
  4588.     DIMENSION FORM(128),FVLD(1,1)
  4589. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  4590. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  4591. C SO INITIALLY IGNORE.
  4592. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  4593. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  4594.     InTeGer*4 RRWACT,RCLACT
  4595. C    COMMON/RCLACT/RRWACT,RCLACT
  4596.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  4597.      1  IDOL7,IDOL8
  4598. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  4599. C     1  IDOL7,IDOL8
  4600.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  4601. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  4602.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  4603. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  4604. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  4605. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  4606.     InTeGer*4 KLVL
  4607. C    COMMON/KLVL/KLVL
  4608.     InTeGer*4 IOLVL,IGOLD
  4609. C    COMMON/IOLVL/IOLVL
  4610. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  4611. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  4612.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  4613.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  4614.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  4615.      3  k3dfg,kcdelt,krdelt,kpag
  4616. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  4617. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  4618. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  4619.     EXTERNAL INDX
  4620.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  4621.     COMMON/D2R/NRDSP,NCDSP
  4622.     InTeGer*4 TYPE(1,1),VLEN(9)
  4623.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1)
  4624.     REAL*8 ACY
  4625.     EQUIVALENCE(ACY,AVBLS(1,27))
  4626.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  4627.     COMMON/FVLDC/FVLD
  4628. C +++++++++++++++++++++++++++++++++++
  4629. C ENABLE { FORMS TO HANDLE ALL POSSIBLE EQUATIONS.
  4630.     CALL FRMEDT(FORM,LLST)
  4631.     IITR=0
  4632. 5050    IITR=IITR+1
  4633.     FORM(111)=Char(0)
  4634.     LCURR=LOW
  4635. C DO AN ENTRY. MUST SCAN FOR MULTIPLE STATEMENTS PER LINE AND ALSO
  4636. C RECOGNIZE FUNCTION NAMES.
  4637. 1000    CONTINUE
  4638.     KKK=ICHAR('\')
  4639.     LSL=INDX(FORM(LCURR),KKK)
  4640.     IF(LSL.EQ.0)LSL=LHIGH-LCURR+1
  4641. C CLAMP AT 80 CHARS LONG INPUT.
  4642.     IF(LSL.LE.79)GOTO 1200
  4643. C STMT HAS NO MULTIPLES. SQUASH IT TO USE ONLY 1ST PART...
  4644.     LSL=79
  4645.     LCURR=LHIGH
  4646.     FORM(80)=Char(0)
  4647. 1200    CONTINUE
  4648.     IF(FORM(LCURR).NE.'<')GOTO 5052
  4649.     IF(ACY.GT.0. .AND.
  4650.      2  IITR.LT.100)GOTO 5050
  4651. C ALLOW IN-FORMULA LOOPING PROVIDED % IS POSITIVE AND
  4652. C WITH LIMITED RETRIES...
  4653. C AVOID CALLING DOSTMT WITH BOGUS < CHARACTER AS "FORMULA" SO
  4654. C WE AVOID ERROR MESSAGES.
  4655.     GOTO 5051
  4656. 5052    CONTINUE
  4657.     CALL DOSTMT(FORM(LCURR),LSL)
  4658. 5051    IF (LCURR.GE.LHIGH)RETURN
  4659.     LCURR=LCURR+LSL
  4660.     If(Lcurr.lt.Lhigh)GOTO 1000
  4661.     Return
  4662.     END
  4663. c -h- doif.for    Fri Aug 22 13:03:17 1986    
  4664.     SUBROUTINE DOIF(LINE,LLB,LRB,LLAST)
  4665. C    PARAMETER 1=1,12=12
  4666.     EXTERNAL INDX
  4667.     CHARACTER*1 LINE(110)
  4668.     REAL*8 V1,V2
  4669.     V1=0.
  4670.     V2=0.
  4671.     LS=LRB-LLB+1
  4672.     CALL GETLOG(LINE(LLB),LS,LOGTYP,LASST)
  4673.     LOV1=LLB
  4674.     LHIV1=LASST+LLB-1
  4675.     IF(LOV1.GE.LHIV1)GOTO 100
  4676. C USE SUM FUNCTION HERE AS TYPE OF FCN
  4677.     LT=4
  4678.     CALL DOMFCN(LINE,LOV1,LHIV1,LT,V1)
  4679. 100    CONTINUE
  4680.     IF(LOGTYP.EQ.0)GOTO 1000
  4681.     LOV2=LASST+2+LLB
  4682.     LHIV2=LRB
  4683.     IF(LOV2.GE.LHIV2)GOTO 200
  4684.     LT=4
  4685.     CALL DOMFCN(LINE,LOV2,LHIV2,LT,V2)
  4686. 200    CONTINUE
  4687.     CALL TEST(LOGTYP,LFLAG,V1,V2)
  4688.     IF(LFLAG.EQ.0)GOTO 700
  4689. C HERE HAVE "TRUE" ALTERNATIVE OF IF STMT
  4690.     KKK=ICHAR('|')
  4691.     LBAR=INDX(LINE,KKK)
  4692.     LBAR=MIN0(LBAR,LLAST)
  4693.     LSTM=LRB+1
  4694. C LSTM TO LBAR IS NOW THE STMT TO EVALUATE. SINCE WE ALREADY HAVE A
  4695. C ROUTINE TO EVALUATE A STMT, DO SO. NOTE PARTIAL RECURSION, SO
  4696. C NO NESTED IFS ALLOWED, AND CALL MUST PERMIT RECURSION ON YOUR
  4697. C MACHINE OR FORGET IT. (OK ON PDP11, VAX).
  4698.     LSZ=LBAR-LSTM
  4699.     IF(LSZ.LT.1)GOTO 1000
  4700.     LSZ=LSZ+1
  4701.     CALL DOSTMI(LINE(LSTM),LSZ)
  4702.     GOTO 1000
  4703. 700    CONTINUE
  4704. C HERE HAVE "FALSE" ALTERNATIVE OF IF STMT
  4705.     KKK=ICHAR('|')
  4706.     LBAR=INDX(LINE,KKK)+1
  4707.     LBAR=MIN0(LBAR,LLAST)
  4708.     LSZ=LLAST-LBAR
  4709.     IF(LSZ.LT.1)GOTO 1000
  4710.     LSZ=LSZ+1
  4711.     CALL DOSTMI(LINE(LBAR),LSZ)
  4712. 1000    CONTINUE
  4713. C THAT'S ALL.
  4714.     RETURN
  4715.     END
  4716. c -h- domath.fms    Fri Aug 22 13:03:28 1986    
  4717.     SUBROUTINE DOMATH(INDEXF,VAR,AC,SS,CTR,ACX)
  4718. C COPYRIGHT (C) 1985, 1986 GLENN C.EVERHART
  4719. C ALL RIGHTS RESERVED
  4720.     INCLUDE APARMS.INC
  4721. C    EXTERNAL INDX
  4722.     REAL*8 AC,SS,CTR,ACX,RWRK1,RWRK2
  4723.     DIMENSION EP(20)
  4724.     InTeGer*4 DLFG
  4725. C    COMMON/DLFG/DLFG
  4726.     InTeGer*4 KDRW,KDCL
  4727. C    COMMON/DOT/KDRW,KDCL
  4728.     InTeGer*4 DTRENA
  4729. C    COMMON/DTRCMN/DTRENA
  4730.     REAL*8 EP,PV,FV
  4731.     DIMENSION EP(20)
  4732.     INTEGER*4 KIRR
  4733. C    COMMON/ERNPER/EP,PV,FV,KIRR
  4734.     InTeGer*4 LASTOP
  4735. C    COMMON/ERROR/LASTOP
  4736.     CHARACTER*1 FMTDAT(9,76)
  4737. C    COMMON/FMTBFR/FMTDAT
  4738.     CHARACTER*1 EDNAM(16)
  4739. C    COMMON/EDNAM/EDNAM
  4740.     InTeGer*4 MFID(2),MFMOD(2)
  4741. C    COMMON/FRM/MFID,MFMOD
  4742.     InTeGer*4 JMVFG,JMVOLD
  4743. C    COMMON/FUBAR/JMVFG,JMVOLD
  4744.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  4745.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  4746. CCC    REAL*8 EP,PV,FV
  4747. CCC    COMMON/ERNPER/EP,PV,FV,KIRR
  4748.     REAL*8 VAR,TE
  4749.     INTEGER*4 IWRK1,IWRK2,IDUM
  4750.     LOGICAL*4 LWRK1,LWRK2,LWRK3
  4751.     INTEGER*4 IWRK3
  4752.     EQUIVALENCE(IWRK1,LWRK1),(IWRK2,LWRK2),(IWRK3,LWRK3)
  4753.     InTeGer*4 ICREF,IRREF
  4754. C    COMMON/MIRROR/ICREF,IRREF
  4755.     InTeGer*4 MODPUB,LIMODE
  4756. C    COMMON/MODPUB/MODPUB,LIMODE
  4757.     InTeGer*4 KLKC,KLKR
  4758.     REAL*8 AACP,AACQ
  4759. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  4760.     InTeGer*4 NCEL,NXINI
  4761. C    COMMON/NCEL/NCEL,NXINI
  4762.     CHARACTER*1 NAMARY(20,MROWS)
  4763. C    COMMON/NMNMNM/NAMARY
  4764.     InTeGer*4 NULAST,LFVD
  4765. C    COMMON/NULXXX/NULAST,LFVD
  4766.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  4767.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  4768. CCC    REAL*8 AACP,AACQ
  4769. CCC    InTeGer*4 KLKC,KLKR
  4770. CCC    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  4771.     IF(INDEXF.NE.1)GOTO 100
  4772. C MIN
  4773.     IF(VAR.GE.AC)GOTO 105
  4774.     AC=VAR
  4775.     AACP=KLKC
  4776.     AACQ=KLKR
  4777. 105    CONTINUE
  4778.     ACX=AC
  4779.     RETURN
  4780. 100    IF(INDEXF.NE.2)GOTO 200
  4781. C MAX
  4782.     IF(VAR.LE.AC)GOTO 107
  4783.     AC=VAR
  4784.     AACP=KLKC
  4785.     AACQ=KLKR
  4786. 107    CONTINUE
  4787. C    IF(VAR.GT.AC)AC=VAR
  4788.     ACX=AC
  4789.     RETURN
  4790. 200    IF(INDEXF.NE.3)GOTO 300
  4791. C AVG
  4792.     AC=AC+VAR
  4793.     CTR=CTR+1.
  4794.     ACX=AC/CTR
  4795.     RETURN
  4796. 300    IF(INDEXF.NE.4)GOTO 400
  4797. C SUM
  4798.     AC=AC+VAR
  4799.     ACX=AC
  4800.     RETURN
  4801. 400    IF(INDEXF.NE.5)GOTO 500
  4802. C STD (STANDARD DEVIATION SQUARED)
  4803.     AC=AC+VAR
  4804.     SS=SS+(VAR*VAR)
  4805.     CTR=CTR+1.
  4806.     ACX=(SS-((AC*AC)/CTR))/CTR
  4807.     RETURN
  4808. 500    CONTINUE
  4809.     IF(INDEXF.NE.7)GOTO 600
  4810. C AND
  4811.     IF(SS.NE.0.)IWRK1=AC
  4812.     IF(SS.EQ.0.)IWRK1=VAR
  4813.     SS=1.
  4814.     IWRK2=VAR
  4815.     LWRK1=LWRK1.AND.LWRK2
  4816.     AC=IWRK1
  4817.     ACX=AC
  4818.     RETURN
  4819. 600    IF(INDEXF.NE.8)GOTO 700
  4820. C INCLUSIVE OR
  4821.     IWRK1=AC
  4822.     IWRK2=VAR
  4823.     LWRK1=LWRK1.OR.LWRK2
  4824.     AC=IWRK1
  4825.     ACX=AC
  4826.     RETURN
  4827. 700    IF (INDEXF.NE.9)GOTO 800
  4828. C NOT
  4829.     IWRK1=VAR
  4830.     LWRK1=.NOT.LWRK1
  4831.     AC=IWRK1
  4832.     ACX=AC
  4833.     RETURN
  4834. 800    IF(INDEXF.NE.10)GOTO 1000
  4835. C CNT
  4836. C COUNT NONZERO ENTRIES
  4837.     IF(VAR.NE.0.)AC=AC+1.
  4838.     ACX=AC
  4839.     RETURN
  4840. 1000    CONTINUE
  4841.     IF(INDEXF.NE.11)GOTO 1100
  4842. C NPV
  4843.     IF(SS.EQ.0.)GOTO 1050
  4844.     CTR=CTR+1.
  4845. C    AC=AC+VAR*CTR/SS
  4846.     AC=AC+VAR/(SS**(CTR-1))
  4847.     ACX=AC
  4848.     RETURN
  4849. C    GOTO 1200
  4850. 1050    CONTINUE
  4851.     SS=VAR+1.
  4852.     ACX=0.
  4853.     RETURN
  4854. 1100    if(indexf.ne.12) GOTO 1200
  4855. C LKP
  4856.     IF(SS.NE.0.)GOTO 1150
  4857.     SS=1.
  4858.     AC=VAR
  4859.     ACX=-1.
  4860.     RETURN
  4861. C    GOTO 1200
  4862. 1150    CONTINUE
  4863. C    IF(VAR.GE.AC.AND.ACX.LT.0.)ACX=CTR
  4864.     IF(VAR.LT.AC.OR.ACX.GE.0.)GOTO 1155
  4865.     ACX=CTR
  4866.     AACP=KLKC
  4867.     AACQ=KLKR
  4868. 1155    CONTINUE
  4869.     CTR=CTR+1.
  4870.     RETURN
  4871. 1200    CONTINUE
  4872.     IF(INDEXF.NE.13)GOTO 1300
  4873. C LKN
  4874.     IF(SS.NE.0.)GOTO 1250
  4875.     SS=1.
  4876.     AC=VAR
  4877.     ACX=-1.
  4878.     GOTO 1300
  4879. 1250    CONTINUE
  4880. C    IF(VAR.LE.AC.AND.ACX.LT.0.)ACX=CTR
  4881.     IF(VAR.GT.AC.OR.ACX.GT.0.)GOTO 1256
  4882.     ACX=CTR
  4883.     AACP=KLKC
  4884.     AACQ=KLKR
  4885. 1256    CONTINUE
  4886.     CTR=CTR+1.
  4887.     RETURN
  4888. 1300    CONTINUE
  4889.     IF(INDEXF.NE.14)GOTO 1400
  4890. C LKE
  4891.     IF(SS.NE.0.)GOTO 1350
  4892.     SS=1.
  4893.     AC=VAR
  4894.     ACX=-1.
  4895.     GOTO 1400
  4896. 1350    CONTINUE
  4897. C    IF(VAR.EQ.AC.AND.ACX.LT.0.)ACX=CTR
  4898.     IF(VAR.NE.AC.OR.ACX.GE.0.)GOTO 1355
  4899.     ACX=CTR
  4900.     AACP=KLKC
  4901.     AACQ=KLKR
  4902. 1355    CONTINUE
  4903.     CTR=CTR+1.
  4904.     RETURN
  4905. 1400    CONTINUE
  4906.     IF(INDEXF.NE.15)GOTO 1500
  4907. C XOR
  4908.     IF(SS.NE.0)IWRK1=AC
  4909.     IF(SS.EQ.0)IWRK1=VAR
  4910.     SS=SS+1.
  4911.     IF(SS.EQ.1.)GOTO 1405
  4912.     IWRK2=VAR
  4913.     LWRK3=LWRK1.OR.LWRK2
  4914.     LWRK1=LWRK1.AND.LWRK2
  4915.     IWRK1=IWRK3-IWRK1
  4916. 1405    AC=IWRK1
  4917.     ACX=AC
  4918.     RETURN
  4919. 1500    CONTINUE
  4920.     IF(INDEXF.NE.16)GOTO 1600
  4921. C EQV
  4922. C NOTE THE EQUIVALENCE FUNCTION IS JUST THE COMPLEMENT OF
  4923. C THE XOR FUNCTION. DO THE COMPLEMENT VIA THE .NOT. OPERATOR.
  4924.     IF(SS.NE.0)IWRK1=AC
  4925.     IF(SS.EQ.0)IWRK1=VAR
  4926.     SS=SS+1.
  4927.     IF(SS.EQ.1.)GOTO 1505
  4928.     IWRK2=VAR
  4929.     LWRK3=LWRK1.OR.LWRK2
  4930.     LWRK1=LWRK1.AND.LWRK2
  4931.     IWRK1=IWRK3-IWRK1
  4932.     LWRK1=.NOT.LWRK1
  4933. 1505    AC=IWRK1
  4934.     ACX=AC
  4935.     RETURN
  4936. 1600    CONTINUE
  4937.     IF(INDEXF.NE.17)GOTO 1700
  4938. C MOD
  4939. C MODULO (V1 MOD V2)
  4940.     IF(SS.NE.0)RWRK1=AC
  4941.     IF(SS.EQ.0)RWRK1=VAR
  4942.     SS=SS+1.
  4943.     IF(SS.EQ.1.)GOTO 1605
  4944.     RWRK2=VAR
  4945.     RWRK1=DMOD(RWRK1,RWRK2)
  4946. 1605    AC=RWRK1
  4947.     ACX=AC
  4948.     RETURN
  4949. 1700    CONTINUE
  4950.     IF(INDEXF.NE.18)GOTO 1800
  4951. C REMAINDER -- INTEGER MODULO
  4952.     IF(SS.NE.0)IWRK1=AC
  4953.     IF(SS.EQ.0)IWRK1=VAR
  4954.     SS=SS+1.
  4955.     IF(SS.EQ.1.)GOTO 1705
  4956.     IWRK2=VAR
  4957.     IWRK1=JMOD(IWRK1,IWRK2)
  4958. 1705    AC=IWRK1
  4959.     ACX=AC
  4960.     RETURN
  4961. 1800    CONTINUE
  4962.     IF(INDEXF.NE.19)GOTO 1900
  4963. C SGN
  4964. C RETURN 1.0 * SIGN OF ARGUMENT.
  4965.     AC=DSIGN(1.0D0,VAR)
  4966.     ACX=AC
  4967.     RETURN
  4968. 1900    CONTINUE
  4969.     IF(INDEXF.NE.20)GOTO 2000
  4970. C IRR - INTERNAL RATE OF RETURN
  4971.     AC=0.
  4972.     ACX=0.
  4973.     IF(KIRR.LT.20)KIRR=KIRR+1
  4974.     IF(KIRR.EQ.1)PV=VAR
  4975.     IF(KIRR.EQ.2)FV=VAR
  4976.     IF(KIRR.LT.3)RETURN
  4977. C IRRPV,FV,RETURNS...
  4978.     IWRK1=KIRR-2
  4979.     EP(IWRK1)=VAR
  4980.     RWRK1=.15
  4981.     RWRK2=.25
  4982. C ITERATIVELY SOLVE FOR INTERNAL RATE OF RETURN.
  4983. 1903    TE=0.
  4984.     SS=FV/((1.D0+RWRK1)**(IWRK1))
  4985.     DO 1905 IWRK2=1,IWRK1
  4986.     AC=EP(IWRK2)/((1.D0+RWRK1)**IWRK2)
  4987.     SS=SS+AC
  4988. 1905    CONTINUE
  4989.     RWRK2=RWRK1*(SS+TE)/PV
  4990.     IF(DABS(RWRK1-RWRK2).LT..00001)GOTO 1910
  4991.     RWRK1=RWRK2
  4992.     GOTO 1903
  4993. 1910    CONTINUE
  4994.     AC=RWRK2
  4995.     ACX=AC
  4996.     RETURN
  4997. 2000    CONTINUE
  4998.     IF(INDEXF.NE.21)GOTO 2100
  4999. C RND[] - RANDOM NUMBER RETURN
  5000.     AC=RND(IDUM)
  5001.     ACX=AC
  5002.     RETURN
  5003. 2100    CONTINUE
  5004.        IF(INDEXF.NE.22)GOTO 2200
  5005. C PMT FUNCTION
  5006. C PMT[PRINCIPAL, INTEREST, NPERIODS] ARE ARGS
  5007. C PAYMENT (MORTGAGE PAYMENT PER PERIOD
  5008. C COMPUTED AS PAYMENT=PRINCIPAL*(INTEREST/(1-(1+INTEREST)**NPERIODS))
  5009. C (CORRECT EVEN IF INTEREST=0
  5010. C (REUSE COUNTER USED IN IRR ARGUMENTS HERE)
  5011.     AC=0.
  5012.     ACX=0.
  5013.     KIRR=KIRR+1
  5014.     EP(KIRR)=VAR
  5015.     IF(KIRR.LT.3)RETURN
  5016. C FIRST GET ALL THE INPUTS, THEN DO THE REAL RESULT.
  5017.     AC=EP(1)*(EP(2)/(1.-((1.+EP(2))**(-EP(3)))))
  5018.     ACX=AC
  5019.     RETURN
  5020. 2200    CONTINUE
  5021.     IF(INDEXF.NE.23)GOTO 2300
  5022. C PVL FUNCTION
  5023. C PVL[PAYMENT,INTEREST,NPERIODS] ARE ARGS
  5024. C PRESENT VALUE COMPUTED AS
  5025. C PV=PAYMENT*(1.-(1.+INTEREST)**-NPERIODS)/INTEREST
  5026. C (REUSE COUNTER USED IN IRR ARGUMENTS HERE)
  5027.     AC=0.
  5028.     ACX=0.
  5029.     KIRR=KIRR+1
  5030.     EP(KIRR)=VAR
  5031.     IF(KIRR.LT.3)RETURN
  5032. C FIRST GET ALL THE INPUTS, THEN DO THE REAL RESULT.
  5033.     AC=EP(1)*EP(3)
  5034.     IF(EP(3).EQ.0..OR.EP(2).EQ.0.)GOTO 2205
  5035.     AC=EP(1)*((1.-(1.+EP(2))**(-EP(3)))/EP(2))
  5036. 2205    ACX=AC
  5037.     RETURN
  5038. 2300    CONTINUE
  5039.     IF(INDEXF.NE.24)GOTO 2400
  5040. C AVE AVERAGE EXCLUDING ZERO CELLS
  5041.     IF(VAR.EQ.0.)GOTO 2305
  5042.     AC=AC+VAR
  5043.     CTR=CTR+1.
  5044. 2305    ACX=AC/DMAX1(CTR,1.0D0)
  5045.     RETURN
  5046. 2400    CONTINUE
  5047.     IF(INDEXF.NE.25)GOTO 2500
  5048. C CHS
  5049. C CHOOSE FROM ARGS USING 1ST ARG AS COUNT INTO RANGE...
  5050. C (SIMILAR TO CLASSICAL "CHOOSE" FUNCTION...)
  5051. C RETURNS 0.0 OR VALUE OF NTH ARG WHERE N IS INDEX OF ARG...
  5052. C    IF(KIRR.EQ.0)ACX=0.
  5053.     KIRR=KIRR+1
  5054.     IF(KIRR.EQ.1)IWRK1=VAR+1.
  5055.     IF(KIRR.NE.IWRK1)GOTO 2450
  5056. C SAVE LOCATION ALSO OF CELLS.
  5057. C THIS ALLOWS US TO FIND ADDRESSES OF SELECTED CELLS IN CHOOSE FOR ADDRESS MATH.
  5058.     AACP=KLKC
  5059.     AACQ=KLKR
  5060.     SS=VAR
  5061. 2450    CONTINUE
  5062.     ACX=SS
  5063.     AC=ACX
  5064.     RETURN
  5065. 2500    CONTINUE
  5066.     IF(INDEXF.NE.26)GOTO 2600
  5067. C ATM ARCTAN OF 2 ARGS
  5068.     IF(SS.NE.0.)RWRK1=AC
  5069.     IF(SS.EQ.0.)RWRK1=VAR
  5070.     SS=SS+1.
  5071.     IF(SS.LE.1.1)GOTO 2505
  5072.     RWRK2=VAR
  5073. C GET 4 QUADRANT ARCTAN
  5074.     RWRK1=DATAN2(RWRK1,RWRK2)
  5075. 2505    AC=RWRK1
  5076.     ACX=AC
  5077.     RETURN
  5078. 2600    CONTINUE
  5079.     RETURN
  5080.     END
  5081. c -h- domfcn.for    Fri Aug 22 13:03:40 1986    
  5082.     SUBROUTINE DOMFCN(LINE,LLB,LRB,INDEXF,ACX)
  5083. C LLB = LOC OF
  5084. C LRB = LOC OF
  5085. C INDEXF IS AS ABOVE. GUARANTEED IN RANGE 1-5.
  5086.     INCLUDE APARMS.INC
  5087.     CHARACTER*1 LINE(110)
  5088. C +++++++++++++++++++++++++++++++++++
  5089. C PARAMETER 18060=60*301
  5090.     CHARACTER*1 FORM,FVLD,CMDLIN(132)
  5091.     EXTERNAL INDX
  5092.     INTEGER*4 VNLT
  5093.     DIMENSION FORM(128),FVLD(1,1)
  5094. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  5095. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  5096. C SO INITIALLY IGNORE.
  5097. C    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  5098. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  5099.     InTeGer*4 RRWACT,RCLACT
  5100. C    COMMON/RCLACT/RRWACT,RCLACT
  5101.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  5102.      1  IDOL7,IDOL8
  5103. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  5104. C     1  IDOL7,IDOL8
  5105.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  5106. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  5107.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  5108. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  5109. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  5110. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  5111.     InTeGer*4 KLVL,k3dfg,kcdelt,krdelt,kshtf
  5112. C    COMMON/KLVL/KLVL
  5113.     InTeGer*4 IOLVL,IGOLD
  5114. C    COMMON/IOLVL/IOLVL
  5115. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  5116. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  5117.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  5118.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  5119.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  5120.      3  k3dfg,kcdelt,krdelt,kshtf
  5121. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  5122. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  5123. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  5124. c     3  K3DFG,KCDelt,KRDelt,kpag
  5125.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  5126.     COMMON/D2R/NRDSP,NCDSP
  5127.     InTeGer*4 TYPE(1,1),VLEN(9)
  5128.     REAL*8 XVBLS(1,1)
  5129.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1)
  5130.     INTEGER*4 JVBLS(2,1,1)
  5131.     EQUIVALENCE(JVBLS(1,1,1),XVBLS(1,1))
  5132.     REAL*8 XXX
  5133.     EQUIVALENCE(VBLS(1,1,1),XVBLS(1,1))
  5134.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  5135.     REAL*8 ACX,ACY
  5136.     REAL*8 AC,SS,CTR
  5137.     EQUIVALENCE(ACY,AVBLS(1,27))
  5138.     InTeGer*4 DLFG
  5139. C    COMMON/DLFG/DLFG
  5140.     InTeGer*4 KDRW,KDCL
  5141. C    COMMON/DOT/KDRW,KDCL
  5142.     InTeGer*4 DTRENA
  5143. C    COMMON/DTRCMN/DTRENA
  5144.     REAL*8 EP,PV,FV
  5145.     DIMENSION EP(20)
  5146.     INTEGER*4 KIRR
  5147. C    COMMON/ERNPER/EP,PV,FV,KIRR
  5148.     InTeGer*4 LASTOP
  5149. C    COMMON/ERROR/LASTOP
  5150.     CHARACTER*1 FMTDAT(9,76)
  5151. C    COMMON/FMTBFR/FMTDAT
  5152.     CHARACTER*1 EDNAM(16)
  5153. C    COMMON/EDNAM/EDNAM
  5154.     InTeGer*4 MFID(2),MFMOD(2)
  5155. C    COMMON/FRM/MFID,MFMOD
  5156.     InTeGer*4 JMVFG,JMVOLD
  5157. C    COMMON/FUBAR/JMVFG,JMVOLD
  5158.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  5159.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  5160. CCC    InTeGer*4 KDRW,KDCL
  5161. CCC    COMMON /DOT/KDRW,KDCL
  5162.     CHARACTER*1 ILINE(106)
  5163.     InTeGer*4 ILNFG,ILNCT
  5164.     COMMON/ILN/ILNFG,ILNCT,ILINE
  5165.     COMMON/FVLDC/FVLD
  5166.     InTeGer*4 ICREF,IRREF
  5167. C    COMMON/MIRROR/ICREF,IRREF
  5168.     InTeGer*4 MODPUB,LIMODE
  5169. C    COMMON/MODPUB/MODPUB,LIMODE
  5170.     InTeGer*4 KLKC,KLKR
  5171.     REAL*8 AACP,AACQ
  5172. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  5173.     InTeGer*4 NCEL,NXINI
  5174. C    COMMON/NCEL/NCEL,NXINI
  5175.     CHARACTER*1 NAMARY(20,MROWS)
  5176. C    COMMON/NMNMNM/NAMARY
  5177.     InTeGer*4 NULAST,LFVD
  5178. C    COMMON/NULXXX/NULAST,LFVD
  5179.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  5180.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  5181. CCC    InTeGer*4 KLKC,KLKR
  5182.     REAL*8 ACP,ACQ
  5183. CCC    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  5184.     EQUIVALENCE(ACP,AVBLS(1,16)),(ACQ,AVBLS(1,17))
  5185. C +++++++++++++++++++++++++++++++++++
  5186. C
  5187. C FIRST GET A VARIABLE NAME. ALL MATH FUNCTIONS REQUIRE VARIABLE
  5188. C NAMES SINCE THEIR VARIABLES ARE THEIR ONLY VALID ARGS.
  5189.     CALL MTHINI(INDEXF,AC,SS,CTR,ACX)
  5190. C SET UP PROPER INITS
  5191. C KV2=1 IF A 2ND VBL EXISTS
  5192.     LCR=LLB+1
  5193.     AACP=ACP
  5194.     AACQ=ACQ
  5195. C INIT SAVED P, Q AC'S HERE IN CASE DOMATH MODIFIES...
  5196. C THIS ALLOWS SELECTION FUNCTIONS TO SET COL, ROW IN P AND Q AC.
  5197. 100    CONTINUE
  5198.     KV2=0
  5199.     LB=LCR
  5200.     LE=LRB-1
  5201.     IF(LB.GE.LE)RETURN
  5202.     CALL VARSCN(LINE,LB,LE,LASST,ID1,ID2,IVALID)
  5203.     IF(IVALID.EQ.0)RETURN
  5204. C USE extra cell to check for different sheets, same row/col
  5205. C use separator of } to indicate range is depth.
  5206.     KPG1=KSHTF
  5207.     KDEPSP=0
  5208.     if(Line(Lasst).eq.'}')Goto 8601
  5209.     IF(LINE(LASST).NE.':')GOTO 110
  5210.     Goto 8603
  5211. 8601    Continue
  5212.     KDepsp=1
  5213. 8603    Continue
  5214.     LB=LASST+1
  5215.     LE=LRB-1
  5216.     CALL VARSCN(LINE,LB,LE,LASST,ID1B,ID2B,IVALID)
  5217.     IF(IVALID.NE.0)KV2=1
  5218.     KPG2=KSHTF
  5219.     If(KDepsp.ne.1)goto 8604
  5220.     KDp=0
  5221.     If (kv2.eq.0)goto 8606
  5222.     KDp=kpg2-kpg1
  5223. C KDp is depth to go through. If negative set to zero.
  5224.     if(KDp.lt.0)kdp=0
  5225. 8606    Continue
  5226. 8605    Continue
  5227.     CALL XVBLGT(ID1,ID2,XVBLS(1,1))
  5228.     XXX=XVBLS(1,1)
  5229.     CALL TYPGET(ID1,ID2,TYPE(1,1))
  5230. C USE EQUIVALENCE OF JVBLS AND XVBLS
  5231.     IF(ABS(TYPE(1,1)).NE.2)XXX=JVBLS(1,1,1)
  5232.     KLKC=ID1
  5233.     KLKR=ID2-1
  5234.     CALL DOMATH(INDEXF,XXX,AC,SS,CTR,ACX)
  5235.     id1=id1+kcdelt
  5236.     id2=id2+krdelt
  5237.     kdp=kdp-1
  5238. C Handle all math over the depth argument.
  5239. C (Only partially decode; if argument is ill-formed
  5240. C  then just act as if range were directly below the
  5241. C  top cell.)
  5242.     if(KDp.ge.0)goto 8605
  5243.     GoTo 200
  5244. 8604    Continue
  5245. 110    CONTINUE
  5246.     CALL XVBLGT(ID1,ID2,XVBLS(1,1))
  5247.     XXX=XVBLS(1,1)
  5248. C    XXX=XVBLS(ID1,ID2)
  5249.     CALL TYPGET(ID1,ID2,TYPE(1,1))
  5250. C USE EQUIVALENCE OF JVBLS AND XVBLS
  5251.     IF(IABS(TYPE(1,1)).NE.2)XXX=JVBLS(1,1,1)
  5252.     KLKC=ID1
  5253.     KLKR=ID2-1
  5254.     CALL DOMATH(INDEXF,XXX,AC,SS,CTR,ACX)
  5255.     IF(KV2.EQ.0)GOTO 200
  5256.     IF(ID1.NE.ID1B) GOTO 120
  5257.     IF(ID2.GT.ID2B)GOTO 200
  5258.     M=ID2+1
  5259.     DO 121 MM=M,ID2B
  5260.     CALL XVBLGT(ID1,MM,XVBLS(1,1))
  5261.     XXX=XVBLS(1,1)
  5262.     CALL TYPGET(ID1,MM,TYPE(1,1))
  5263. C    XXX=XVBLS(ID1,MM)
  5264.     IF(IABS(TYPE(1,1)).NE.2)XXX=JVBLS(1,1,1)
  5265.     KLKC=ID1
  5266.     KLKR=MM-1
  5267.     CALL DOMATH(INDEXF,XXX,AC,SS,CTR,ACX)
  5268. 121    CONTINUE
  5269.     GOTO 200
  5270. 120    CONTINUE
  5271.     IF(ID2.NE.ID2B)GOTO 130
  5272.     IF(ID1.GT.ID1B)GOTO 200
  5273.     M=ID1+1
  5274.     DO 131 MM=M,ID1B
  5275.     CALL XVBLGT(MM,ID2,XVBLS(1,1))
  5276.     XXX=XVBLS(1,1)
  5277. C    XXX=XVBLS(MM,ID2)
  5278.     CALL TYPGET(MM,ID2,TYPE(1,1))
  5279.     IF(IABS(TYPE(1,1)).NE.2)XXX=JVBLS(1,1,1)
  5280.     KLKC=MM
  5281.     KLKR=ID2-1
  5282.     CALL DOMATH(INDEXF,XXX,AC,SS,CTR,ACX)
  5283. 131    CONTINUE
  5284. 130    CONTINUE
  5285. 200    CONTINUE
  5286. C IF NEXT CHAR IS A COMMA, SKIP IT AND KEEP UP SCAN UNLESS DONE
  5287.     IF(LINE(LASST).EQ.',')GOTO 300
  5288.     ACP=AACP
  5289.     ACQ=AACQ
  5290. C USE P, Q ACCUMULATORS FOR SELECTED COL, ROW COORDS FROM DOMATH
  5291.     RETURN
  5292. 300    LCR=LASST+1
  5293.     GOTO 100
  5294.     END
  5295. c -h- dostmi.for    Fri Aug 22 13:03:55 1986    
  5296.     SUBROUTINE DOSTMI(LINE,LLAST)
  5297. C COPY OF DOSTMT FOR IF FUNCTION.
  5298. C HANDLE 1 STATEMENT PARSING (DOES A BIT MORE OF THE WORK WITH THE
  5299. C PART OF THE LINE STRIPPED TO HAVE EXACTLY ONE COMMAND IN IT.
  5300.     CHARACTER*1 LINE(110)
  5301. C +++++++++++++++++++++++++++++++++++
  5302. C PARAMETER 18060=60*301
  5303.     EXTERNAL INDX
  5304.     CHARACTER*1 FORM,FVLD,CMDLIN(132)
  5305.     INTEGER*4 VNLT
  5306.     DIMENSION FORM(128),FVLD(1,1)
  5307. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  5308. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  5309. C SO INITIALLY IGNORE.
  5310.     COMMON/FVLDC/FVLD
  5311. C    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  5312. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  5313.     InTeGer*4 RRWACT,RCLACT
  5314. C    COMMON/RCLACT/RRWACT,RCLACT
  5315.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  5316.      1  IDOL7,IDOL8
  5317. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  5318. C     1  IDOL7,IDOL8
  5319.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  5320. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  5321.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  5322. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  5323. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  5324. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  5325.     InTeGer*4 KLVL
  5326. C    COMMON/KLVL/KLVL
  5327.     InTeGer*4 IOLVL,IGOLD
  5328. C    COMMON/IOLVL/IOLVL
  5329. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  5330. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  5331.  
  5332.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  5333.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  5334.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  5335.      3  k3dfg,kcdelt,krdelt,kpag
  5336. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  5337. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  5338. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  5339.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  5340.     COMMON/D2R/NRDSP,NCDSP
  5341.     InTeGer*4 TYPE(1,1),VLEN(9)
  5342.     REAL*8 XVBLS(1,1)
  5343.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1)
  5344.     INTEGER*4 JVBLS(2,1,1)
  5345.     EQUIVALENCE(JVBLS(1,1,1),XVBLS(1,1))
  5346.     EQUIVALENCE(VBLS(1,1,1),XVBLS(1,1))
  5347.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  5348.     REAL*8 ACX,ACY,AACY
  5349.     INTEGER*4 IACY,IIJACY
  5350.     EQUIVALENCE(IIJACY,AACY)
  5351.     EQUIVALENCE(IACY,AVBLS(1,27))
  5352.     EQUIVALENCE(ACY,AVBLS(1,27))
  5353.     InTeGer*4 DLFG
  5354. C    COMMON/DLFG/DLFG
  5355.     InTeGer*4 KDRW,KDCL
  5356. C    COMMON/DOT/KDRW,KDCL
  5357.     InTeGer*4 DTRENA
  5358. C    COMMON/DTRCMN/DTRENA
  5359.     REAL*8 EP,PV,FV
  5360.     DIMENSION EP(20)
  5361.     INTEGER*4 KIRR
  5362. C    COMMON/ERNPER/EP,PV,FV,KIRR
  5363.     InTeGer*4 LASTOP
  5364. C    COMMON/ERROR/LASTOP
  5365.     CHARACTER*1 FMTDAT(9,76)
  5366. C    COMMON/FMTBFR/FMTDAT
  5367.     CHARACTER*1 EDNAM(16)
  5368. C    COMMON/EDNAM/EDNAM
  5369.     InTeGer*4 MFID(2),MFMOD(2)
  5370. C    COMMON/FRM/MFID,MFMOD
  5371.     InTeGer*4 JMVFG,JMVOLD
  5372. C    COMMON/FUBAR/JMVFG,JMVOLD
  5373.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  5374.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  5375. CCC    InTeGer*4 KDRW,KDCL
  5376. CCC    COMMON /DOT/KDRW,KDCL
  5377.     CHARACTER*1 ILINE(106)
  5378.     InTeGer*4 ILNFG,ILNCT
  5379.     COMMON/ILN/ILNFG,ILNCT,ILINE
  5380. C +++++++++++++++++++++++++++++++++++
  5381.     CALL FNAME(LINE,LLAST,INDEXF)
  5382. C ABOVE GETS FUNCTION NAMES.
  5383. C    NAME    INDEXF
  5384. C    MIN    1
  5385. C    MAX    2
  5386. C    AVG    3
  5387. C    SUM    4
  5388. C    STD    5    (STD DEVIATION)
  5389. C    IF    6    (IF STMT)
  5390. C    AND    7
  5391. C    OR    8
  5392. C    NOT    9
  5393. C    CNT    10 (COUNTS NONZERO ENTRIES)
  5394. C    NPV    11 NET PRESENT VALUE
  5395. C    LKP    12 LOOKUP IN LIST, GIVE OFFSET 0 BASED
  5396. C    LKN    13    LOOKUP NEGATIVE (INVERSE OF LKP)
  5397. C    LKE    14    LOOKUP EQUAL
  5398. C    XOR    15    EXCLUSIVE OR
  5399. C    EQV    16    EQUIVALENCE (TRUE IF BITS EQUAL)
  5400. C    MOD    17    V1 MODULO V2
  5401. C    REM    18    REMAINDER OF V1/V2
  5402. C    SGN    19    SIGN OF V1 (-1.,0., OR +1.)
  5403. C    IRR    20    INTERNAL RATE OF RETURN
  5404. C USE  AND  TO DELIMIT FUNCTION ARGS.
  5405. C *****************************************************************************
  5406. C **** NOTE: MAX 20 IS KEPT AS A LITERAL IN NEXTEL ALSO AS FLAG THAT FUNCTION
  5407. C **** FAILED TO FIND VALID LITERAL. CHANGE THERE TOO IF YOU ADD MORE FUNCTIONS.
  5408.     IF(INDEXF.LT.1.OR.INDEXF.GT.26)GOTO 1000
  5409. C HERE IF A FUNCTION OR AN IF STMT (FORMAT= IF varRELvarstmt|else-stmt)
  5410. C
  5411. C ALLOW CALC TO HANDLE ALL BUT IF STMTS
  5412.     IF(INDEXF.NE.6)GOTO 1000
  5413. C
  5414. C **** FIXUP '' NEXT. 2 LINES. REPLACE HERE... ***
  5415.     KKK=ICHAR('[')
  5416.     LLB=INDX(LINE,KKK)
  5417.     KKK=ICHAR(']')
  5418.     LRB=INDX(LINE,KKK)
  5419. C *** ERROR WITH FORMAT -- NO  SEEN IN TIME. JUST IGNORE IT.
  5420.     IF(LLB.GT.LLAST)RETURN
  5421.     IF(LRB.GT.LLAST)LRB=LLAST
  5422. C ** COMMENT OUT NEVER-USED CODE NEXT AREA...
  5423. C
  5424. C    IF(INDEXF.EQ.6)GOTO 2000
  5425. CC ISOLATE MATH FUNCTIONS
  5426. C    CALL DOMFCN(LINE,LLB,LRB,INDEXF,ACX)
  5427. CC GET % ABOVE
  5428. C    CALL TYPGET(KDRW,KDCL,TYPE(1,1))
  5429. C    IF(IABS(TYPE(1,1)).NE.2)GOTO 1760
  5430. C    CALL XVBLST(KDRW,KDCL,ACX)
  5431. CC    XVBLS(KDRW,KDCL)=ACX
  5432. CC LEAVE RESULT IN % TOO.
  5433. C    ACY=ACX
  5434. C    CALL TYPSET(27,1,TYPE(1,1))
  5435. CC    TYPE(27,1)=TYPE(KDRW,KDCL)
  5436. C    RETURN
  5437. C1760    JVBLS(1,1,1)=ACX
  5438. C    CALL JVBLST(1,KDRW,KDCL,JVBLS(1,1,1))
  5439. CC    JVBLS(1,KDRW,KDCL)=ACX
  5440. C    RETURN
  5441. 2000    CONTINUE
  5442. C HANDLE AN "IF" STATEMENT
  5443. C ILLEGAL HERE INSIDE AN IF, SO JUST IGNORE IT.
  5444. C    CALL DOIF(LINE,LLB,LRB,LLAST)
  5445. C PASS LLAST TO DOIF SINCE WE DON'T EXPECT ] AS LAST CHAR OF STMT.
  5446. C NO DIRECT SET OF VRBL HERE...
  5447.     RETURN
  5448. 1000    CONTINUE
  5449. C HERE JUST HAVE SOMETHING TO PASS TO CALC. DO SO.
  5450.     ILNFG=1
  5451.     LMX=LLAST-1
  5452.     DO 1001 N1=1,LMX
  5453. 1001    ILINE(N1)=LINE(N1)
  5454.     ILNCT=LMX
  5455. C PROTECT CALC FROM ANY PART OF A LINE LONGER THAN 80 CHARS (ITS MAX)
  5456.     IF(ILNCT.GT.80)ILNCT=80
  5457.     CALL CALC
  5458. C STORE EXPRESSION RESULT.
  5459. C CONVERT BETWEEN TYPES FIRST IF NEED BE
  5460.     CALL TYPGET(KDRW,KDCL,LMX)
  5461.     CALL TYPGET(27,1,N1)
  5462.     LMX=IABS(LMX)
  5463.     N1=IABS(N1)
  5464.     IF(N1.EQ.1.OR.(N1.GE.3.AND.N1.LE.8))GOTO 8739
  5465.     N1=2
  5466.     GOTO 8740
  5467. 8739    CONTINUE
  5468.     N1=4
  5469. 8740    CONTINUE
  5470. C ONLY CONCERN HERE IS REAL TYPES (CODE=2) AND INT TYPES (CODE=4)
  5471.     AACY=ACY
  5472.     IF(N1.EQ.LMX)GOTO 2670
  5473.     IF(N1.EQ.2)IIJACY=ACY
  5474.     IF(N1.EQ.4)AACY=IACY
  5475. C DO WHICHEVER CONVERSION IS NEEDED IF ONE IS NEEDED AT ALL.
  5476. 2670    CONTINUE
  5477.     CALL XVBLST(KDRW,KDCL,AACY)
  5478. C    XVBLS(KDRW,KDCL)=ACY
  5479.     RETURN
  5480.     END
  5481. c -h- dostmt.for    Fri Aug 22 13:03:55 1986    
  5482.     SUBROUTINE DOSTMT(LINE,LLAST)
  5483. C HANDLE 1 STATEMENT PARSING (DOES A BIT MORE OF THE WORK WITH THE
  5484. C PART OF THE LINE STRIPPED TO HAVE EXACTLY ONE COMMAND IN IT.
  5485.     CHARACTER*1 LINE(110)
  5486. C +++++++++++++++++++++++++++++++++++
  5487.     CHARACTER*1 FORM,FVLD,CMDLIN(132)
  5488.     EXTERNAL INDX
  5489.     INTEGER*4 VNLT
  5490.     DIMENSION FORM(128),FVLD(1,1)
  5491. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  5492. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  5493. C SO INITIALLY IGNORE.
  5494.     COMMON/FVLDC/FVLD
  5495.     InTeGer*4 RRWACT,RCLACT
  5496. C    COMMON/RCLACT/RRWACT,RCLACT
  5497.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  5498.      1  IDOL7,IDOL8
  5499. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  5500. C     1  IDOL7,IDOL8
  5501.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  5502. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  5503.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  5504. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  5505. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  5506. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  5507.     InTeGer*4 KLVL
  5508. C    COMMON/KLVL/KLVL
  5509.     InTeGer*4 IOLVL,IGOLD
  5510. C    COMMON/IOLVL/IOLVL
  5511. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  5512. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  5513.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  5514.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  5515.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  5516.      3  k3dfg,kcdelt,krdelt,kpag
  5517. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  5518. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  5519. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  5520. C    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  5521. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  5522.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  5523.     COMMON/D2R/NRDSP,NCDSP
  5524.     InTeGer*4 TYPE(1,1),VLEN(9)
  5525.     REAL*8 XVBLS(1,1)
  5526.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1)
  5527.     INTEGER*4 JVBLS(2,1,1)
  5528.     EQUIVALENCE(JVBLS(1,1,1),XVBLS(1,1))
  5529.     EQUIVALENCE(VBLS(1,1,1),XVBLS(1,1))
  5530.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  5531.     REAL*8 ACX,ACY,AACY
  5532.     INTEGER*4 IACY,IIJACY
  5533.     EQUIVALENCE(IACY,AVBLS(1,27))
  5534.     EQUIVALENCE(ACY,AVBLS(1,27))
  5535.     EQUIVALENCE(IIJACY,AACY)
  5536.     InTeGer*4 DLFG
  5537. C    COMMON/DLFG/DLFG
  5538.     InTeGer*4 KDRW,KDCL
  5539. C    COMMON/DOT/KDRW,KDCL
  5540.     InTeGer*4 DTRENA
  5541. C    COMMON/DTRCMN/DTRENA
  5542.     REAL*8 EP,PV,FV
  5543.     DIMENSION EP(20)
  5544.     INTEGER*4 KIRR
  5545. C    COMMON/ERNPER/EP,PV,FV,KIRR
  5546.     InTeGer*4 LASTOP
  5547. C    COMMON/ERROR/LASTOP
  5548.     CHARACTER*1 FMTDAT(9,76)
  5549. C    COMMON/FMTBFR/FMTDAT
  5550.     CHARACTER*1 EDNAM(16)
  5551. C    COMMON/EDNAM/EDNAM
  5552.     InTeGer*4 MFID(2),MFMOD(2)
  5553. C    COMMON/FRM/MFID,MFMOD
  5554.     InTeGer*4 JMVFG,JMVOLD
  5555. C    COMMON/FUBAR/JMVFG,JMVOLD
  5556.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  5557.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  5558. CCC    InTeGer*4 KDRW,KDCL
  5559. CCC    COMMON /DOT/KDRW,KDCL
  5560.     CHARACTER*1 ILINE(106)
  5561.     InTeGer*4 ILNFG,ILNCT
  5562.     COMMON/ILN/ILNFG,ILNCT,ILINE
  5563.  
  5564. C +++++++++++++++++++++++++++++++++++
  5565.     CALL FNAME(LINE,LLAST,INDEXF)
  5566. C ABOVE GETS FUNCTION NAMES.
  5567. C    NAME    INDEXF
  5568. C    MIN    1
  5569. C    MAX    2
  5570. C    AVG    3
  5571. C    SUM    4
  5572. C    STD    5    (STD DEVIATION)
  5573. C    IF    6    (IF STMT)
  5574. C    AND    7
  5575. C    OR    8
  5576. C    NOT    9
  5577. C    CNT    10 (COUNTS NONZERO ENTRIES)
  5578. C    NPV    11 NET PRESENT VALUE
  5579. C    LKP    12 LOOKUP IN LIST, GIVE OFFSET 0 BASED
  5580. C    LKN    13    LOOKUP NEGATIVE (INVERSE OF LKP)
  5581. C    LKE    14    LOOKUP EQUAL
  5582. C    XOR    15    EXCLUSIVE OR
  5583. C    EQV    16    EQUIVALENCE (TRUE IF BITS EQUAL)
  5584. C    MOD    17    V1 MODULO V2
  5585. C    REM    18    REMAINDER OF V1/V2
  5586. C    SGN    19    SIGN OF V1 (-1.,0., OR +1.)
  5587. C    IRR    20    INTERNAL RATE OF RETURN
  5588. C    RND    21    RANDOM NUMBER BETWEEN 0 AND 1.
  5589. C    PMT    22    PAYMENT FUNCTION
  5590. C    PVL    23    PRESENT VALUE
  5591. C    AVE    24    AVEREAGE EXCLUDING ZERO CELLS
  5592. C    CHS    25    CHOOSE
  5593. C    ATM    26    ARC TAN OF MULTIPLE ARGS (2 ARGS)
  5594. C USE  AND  TO DELIMIT FUNCTION ARGS.
  5595. C *****************************************************************************
  5596. C **** NOTE: MAX 26 IS KEPT AS A LITERAL IN NEXTEL ALSO AS FLAG THAT FUNCTION
  5597. C **** FAILED TO FIND VALID LITERAL. CHANGE THERE TOO IF YOU ADD MORE FUNCTIONS.
  5598.     IF(INDEXF.LT.1.OR.INDEXF.GT.26)GOTO 1000
  5599. C HERE IF A FUNCTION OR AN IF STMT (FORMAT= IF varRELvarstmt|else-stmt)
  5600. C
  5601. C ALLOW CALC TO HANDLE ALL BUT IF STMTS
  5602.     IF(INDEXF.NE.6)GOTO 1000
  5603. C
  5604.     KKK=ICHAR('[')
  5605.     LLB=INDX(LINE,KKK)
  5606.     KKK=ICHAR(']')
  5607.     LRB=INDX(LINE,KKK)
  5608. C *** ERROR WITH FORMAT -- NO  SEEN IN TIME. JUST IGNORE IT.
  5609.     IF(LLB.GT.LLAST)RETURN
  5610.     IF(LRB.GT.LLAST)LRB=LLAST
  5611. C *** NOTA BENE
  5612. C NEXT STUFF COMMENTED BECAUSE WE CAN NEVER EXECUTE IT...
  5613. C    IF(INDEXF.EQ.6)GOTO 2000
  5614. CC ISOLATE MATH FUNCTIONS
  5615. C    CALL DOMFCN(LINE,LLB,LRB,INDEXF,ACX)
  5616. CC GET % ABOVE
  5617. C    CALL TYPGET(KDRW,KDCL,TYPE(1,1))
  5618. C    IF(IABS(TYPE(1,1)).NE.2)GOTO 1760
  5619. C    CALL XVBLST(KDRW,KDCL,ACX)
  5620. CC    XVBLS(KDRW,KDCL)=ACX
  5621. CC LEAVE RESULT IN % TOO.
  5622. C    ACY=ACX
  5623. C    CALL TYPSET(27,1,TYPE(1,1))
  5624. CC    TYPE(27,1)=TYPE(KDRW,KDCL)
  5625. C    RETURN
  5626. C1760    JVBLS(1,1,1)=ACX
  5627. C    CALL JVBLST(1,KDRW,KDCL,JVBLS(1,1,1))
  5628. CC    JVBLS(1,KDRW,KDCL)=ACX
  5629. C    RETURN
  5630. 2000    CONTINUE
  5631. C HANDLE AN "IF" STATEMENT
  5632.     CALL DOIF(LINE,LLB,LRB,LLAST)
  5633. C PASS LLAST TO DOIF SINCE WE DON'T EXPECT  AS LAST CHAR OF STMT.
  5634. C NO DIRECT SET OF VRBL HERE...
  5635.     RETURN
  5636. 1000    CONTINUE
  5637. C HERE JUST HAVE SOMETHING TO PASS TO CALC. DO SO.
  5638.     ILNFG=1
  5639.     LMX=LLAST-1
  5640.     DO 1001 N1=1,LMX
  5641. 1001    ILINE(N1)=LINE(N1)
  5642.     ILNCT=LMX
  5643. C PROTECT CALC FROM ANY PART OF A LINE LONGER THAN 80 CHARS (ITS MAX)
  5644.     IF(ILNCT.GT.80)ILNCT=80
  5645.     CALL CALC
  5646. C STORE EXPRESSION RESULT.
  5647. C FIRST BE SURE STORING RIGHT TYPE
  5648.     CALL TYPGET(KDRW,KDCL,LMX)
  5649. C ONLY WORRY HERE ABOUT INTEGER VS REAL (INT=4, REAL=2 CODE)
  5650.     CALL TYPGET(27,1,N1)
  5651.     N1=IABS(N1)
  5652.     LMX=IABS(LMX)
  5653. C LET ALL DEFAULT TO TYPE 2 (FLOATING) EXCEPT EXPLICIT INTS
  5654.     IF((N1.EQ.1).OR.(N1.GE.3.AND.N1.LE.8))GOTO 2739
  5655.     N1=2
  5656.     GOTO 2740
  5657. 2739    CONTINUE
  5658.     N1=4
  5659. 2740    CONTINUE
  5660.     AACY=ACY
  5661.     IF((N1).EQ.(LMX))GOTO 2670
  5662. C TYPES DIFFER. CONVERT BETWEEN ACY AND IACY.
  5663.     IF((N1).EQ.4)AACY=IACY
  5664.     IF((N1).EQ.2)IIJACY=ACY
  5665. 2670    CONTINUE
  5666.     CALL XVBLST(KDRW,KDCL,AACY)
  5667. C    XVBLS(KDRW,KDCL)=ACY
  5668.     RETURN
  5669.     END
  5670. c -h- dspfil.for    Fri Aug 22 13:04:12 1986    
  5671.     SUBROUTINE DSPFIL(ICODE,FORM,FORM2,FVLDTP,
  5672.      1  LFTMST,LENTL,LOCOL,FILINE,LLVL,LLU,LLVLF,J)
  5673. C COPYRIGHT (C) 1983 GLENN EVERHART
  5674. C ALL RIGHTS RESERVED
  5675. C DISPLAY SPREAD SHEET ON SCREEN OR IN FILE IF ICODE=10
  5676. C USES UVT100 TO TWEAK THE VT100. NO WRAP IS ASSUMED SO
  5677. C OUTPUT UP TO 132 COLS BY 24 LINES IS OK. ONLY CHECK
  5678. C WIDTH TO ALLOW VT100 LOOKALIKES WITH MORE DISPLAY LINES TOO.
  5679. C NOTE: THROUGHOUT, ROWS ARE ACTUALLY DOWN, COLUMNS ACROSS ON
  5680. C SCREEN. ROW 0 IN DISPLAY IS THE 27 ACCUMULATORS A-Z AND %, WITH
  5681. C % BEING THE LAST-COMPUTED VALUE FROM THE CALC PROGRAM, WHICH
  5682. C KNOWS HOW TO ACCESS THE DATA BUT IS JUST PASSED COMMAND STRINGS
  5683. C FROM THE DISK BASED FILE HERE.
  5684. C    CHARACTER*127 CWRK
  5685. C    CHARACTER*1 CCWRK(128)
  5686.     InTeGer*4 ICODE,LFTMST
  5687. C    EQUIVALENCE(CWRK,CCWRK(1))
  5688.     InTeGer*4 LLU,LLVL,LLVLF
  5689.     InTeGer*4 RRWACT,RCLACT
  5690. C    COMMON/RCLACT/RRWACT,RCLACT
  5691.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  5692.      1  IDOL7,IDOL8
  5693. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  5694. C     1  IDOL7,IDOL8
  5695.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  5696. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  5697.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  5698. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  5699. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  5700. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  5701.     InTeGer*4 KLVL
  5702. C    COMMON/KLVL/KLVL
  5703.     InTeGer*4 IOLVL,IGOLD
  5704. C    COMMON/IOLVL/IOLVL
  5705. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  5706. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  5707.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  5708.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  5709.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  5710.      3  k3dfg,kcdelt,krdelt,kpag
  5711. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  5712. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  5713. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  5714. CCC    InTeGer*4 IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  5715. CCC    COMMON/DOLLR/IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  5716.     EXTERNAL INDX
  5717.     CHARACTER*7 PRTLX
  5718.     CHARACTER*1 FORM,FVLD,CMDLIN(132),PRTLIN(132)
  5719.     EQUIVALENCE(PRTLX(1:1),PRTLIN(1))
  5720. C    INTEGER*4 VNLT
  5721.     CHARACTER*1 FVLDTP
  5722.     CHARACTER*1 LBEL(4)
  5723.     CHARACTER*1 LET1,LET2,FORM2(128),NMSH(80)
  5724.     COMMON/NMSH/NMSH
  5725. C FLAG BORDR=1 IF WE WANT TO OMIT BORDERS ON DRAWING
  5726. C THE SCREEN DISPLAY TO A FILE.
  5727.     InTeGer*4 BORDR,TOMT
  5728. C COMMON ICPOS ALLOWS UVT100 ROUTINE ACCESS TO DISPLAYED NUMBERS
  5729. C FOR USES SUCH AS SETTING COLORS...
  5730.     CHARACTER*1 OARRY(100)
  5731.     InTeGer*4 OSWIT,OCNTR
  5732. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  5733. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  5734.     InTeGer*4 IPS1,IPS2,MODFLG
  5735. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  5736.        InTeGer*4 XTCFG,IPSET,XTNCNT
  5737.        CHARACTER*1 XTNCMD(80)
  5738. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  5739. C VARY FLAG ITERATION COUNT
  5740.     INTEGER KALKIT
  5741. C    COMMON/VARYIT/KALKIT
  5742.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  5743.     InTeGer*4 RCMODE,IRCE1,IRCE2
  5744. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  5745. C     1  IRCE2
  5746. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  5747. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  5748. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  5749. C RCFGX ON.
  5750. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  5751. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  5752. C  AND VM INHIBITS. (SETS TO 1).
  5753.     INTEGER*4 FH
  5754. C FILE HANDLE FOR CONSOLE I/O (RAW)
  5755. C    COMMON/CONSFH/FH
  5756.     CHARACTER*1 ARGSTR(52,4)
  5757. C    COMMON/ARGSTR/ARGSTR
  5758.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  5759.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  5760.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  5761.      3  IRCE2,FH,ARGSTR
  5762. CCC    InTeGer*4 IC1POS,IC2POS
  5763. CCC    COMMON/ICPOS/IC1POS,IC2POS
  5764.     REAL*8 XVBLS(1,1),VDSP,VCLC
  5765.     CHARACTER*1 DFE(14)
  5766.     CHARACTER*14 CDFE
  5767.     EQUIVALENCE(CDFE(1:1),DFE(1))
  5768.     DIMENSION FORM(128),FVLD(1,1)
  5769. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  5770. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  5771. C SO INITIALLY IGNORE.
  5772. C
  5773. C ROUTINE IN2AS COMPUTES ASCII CHARACTER NAMES OF SUBSCRIPTS IN1,IN2
  5774. C SO DISPLAY CAN HAVE THEM. IT MUST BE THE INVERSE OF VARSCN.
  5775. C    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  5776. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  5777.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  5778.     COMMON/D2R/NRDSP,NCDSP
  5779.     InTeGer*4 ILNFG,ILNCT,RCF
  5780.     CHARACTER*1 ILINE(106)
  5781.     COMMON/ILN/ILNFG,ILNCT,ILINE
  5782.     INTEGER LENTL(5),LOCOL(5)
  5783.     CHARACTER*1 FILINE(208)
  5784. CCC    CHARACTER*1 OARRY(100)
  5785. CCC    InTeGer*4 OSWIT,OCNTR
  5786. CCC    COMMON/OAR/OSWIT,OCNTR,OARRY
  5787. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  5788.     InTeGer*4 TYPE(1,1),VLEN(9)
  5789.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1)
  5790.     EQUIVALENCE(XVBLS(1,1),VBLS(1,1,1))
  5791.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  5792. CCC    InTeGer *4 FORMFG,RCFGX
  5793. CCC    COMMON/FFGG/FORMFG,RCFGX
  5794. C
  5795. C DISPLAY ARRAY WILL KEEP A COPY OF VARIABLES DISPLAYED AND FORMATS
  5796. C USED LOCALLY WHICH DISPLAY ROUTINE CAN USE TO SEE WHAT ACTUALLY
  5797. C NEEDS TO BE REFRESHED ON SCREEN. DRWV AND DCLV ARE COLS, ROWS OF
  5798. C DISPLAY ACTUALLY USED FOR SCREEN.
  5799.     InTeGer*4 CWIDS(20)
  5800. C CWIDS IS WIDTHS IN CHARACTERS OF COLUMNS ON DISPLAY. NOTE THAT BECAUSE
  5801. C OF PECULIAR INVERSION WHICH I AM TOO LAZY TO CORRECT IT IS DIMENSIONED
  5802. C AS 20 NOT 75.
  5803.     REAL*8 DVS(20,75)
  5804.     INTEGER*4 LDVS(2,20,75)
  5805.     EQUIVALENCE(LDVS(1,1,1),DVS(1,1))
  5806.     COMMON /FVLDC/FVLD
  5807. C    CHARACTER*1 DFMTS(10,20,75)
  5808. C 10 CHARACTERS PER ENTRY.
  5809. C    COMMON/DSPCMN/DVS,DFMTS,CWIDS
  5810.     COMMON/DSPCMN/DVS,CWIDS
  5811. C THISRW,THISCL = CURRENT DISPLAYED LOCS.
  5812.     InTeGer*4 THISRW,THISCL
  5813. C NOTE ROWS ARE DOWN, COLS ACROSS INTERNALLY.
  5814. C COLUMN 2 = NUMBERS. DISPLAY COLS 2-22 WITH COL 1=TITLE
  5815. C COL 23,24 FOR COMMANDS.(23 (PARAMETER) ACTUALLY.)
  5816. C ROW OFFSET BY 6 FOR NUMBERS.
  5817. C
  5818. C MAINTAIN AN "INITIALIZED" BITMAP HERE TO USE TO AVOID GOING TO
  5819. C FVLD.
  5820. C    CHARACTER*1 IBITMP
  5821. C    DIMENSION IBITMP(2258)
  5822. C    COMMON/INITD/IBITMP
  5823. C NOTE BITMAP IS ZEROED IN SPREDSHT MAIN PROGRAM (OR AT SAVE CMD)
  5824. C AND IS SET HERE (AND HERE ONLY). ONLY USED HERE TOO...
  5825. C    character*100 fwt
  5826. C
  5827. C CODE FOR WINDOW TILING AND FILE READIN...
  5828. C &%FILENAME,NSKIP,NLEN READS FILE SKIPPING NSKIP RECS AND
  5829. C GETS NLEN RECS IN
  5830. C
  5831. C &&%FILENAME,NSKIP,NLEN JUST INSERTS FILE INTO PRINTOUT
  5832.     IF(IDOL4.EQ.0)GOTO 9880
  5833.     LFTMST=J
  5834. C NEED TO DO IT HERE...
  5835. C FORM ARRAY HAS FILE NAME INFO, IF ANY...
  5836.     KKK=ICHAR('&')
  5837.     LLA=INDX(FORM,KKK)
  5838.     IF(LLA.LE.0.OR.LLA.GT.100)GOTO 9882
  5839.     IF(FORM(LLA+1).EQ.'&')GOTO 9881
  5840. C CHECK &% FORM
  5841.     IF(FORM(LLA+1).NE.'%')GOTO 9882
  5842. C GOT &% FORM HERE.
  5843.     IF(LLVL.EQ.0.OR.LLVLF.EQ.1)GOTO 9885
  5844.     DO 9886 LNNN=1,LLVL
  5845.     LLVLN=LLVL+10
  5846.     CLOSE(LLVLN)
  5847. 9886    CONTINUE
  5848.     LLVL=0
  5849. 9885    CONTINUE
  5850.     LTST=LLA+2
  5851.     LLVLF=1
  5852. C OPEN LLVL
  5853.     CALL GETFNL(FORM(LTST),LSKIP,LLEN)
  5854.     IF(LLEN.LE.0)GOTO 9882
  5855.     LLVL=LLVL+1
  5856.     LLU=LLVL+10
  5857.     IF(LLVL.GT.4)GOTO 9931
  5858.     CALL RASSIG(LLU,FORM(LTST))
  5859.     GOTO 9930
  5860. 9931    CONTINUE
  5861.     LENTL(LLVL)=0
  5862.     LOCOL(LLVL)=0
  5863.     CLOSE(LLU)
  5864.     LLVL=LLVL-1
  5865.     LLU=LLVL+10
  5866.     GOTO 9882
  5867. 9930    CONTINUE
  5868.     LOCOL(LLVL)=LFTMST
  5869.     LENTL(LLVL)=LLEN
  5870.     IF(LSKIP.LE.0)GOTO 9906
  5871.     DO 9907 LL=1,LSKIP
  5872. 9907    READ(LLU,9889,END=9909,ERR=9909)FILINE
  5873.     DO 9910 N=1,208
  5874. 9910    FILINE(N)=CHAR(32)
  5875.     GOTO 9911
  5876. 9909    CONTINUE
  5877. C EOF SO CLOSE LUN
  5878.     LENTL(LLVL)=0
  5879.     CLOSE(LLU)
  5880.     LLVL=LLVL-1
  5881.     IF(LLVL.LE.0)GOTO 9880
  5882.     LLU=LLVL+10
  5883. 9911    CONTINUE
  5884. 9906    CONTINUE
  5885. C FILE SET UP NOW... READ IN AT 9982...
  5886. C RECORD COL # OVER FOR THIS RECURSION LEVEL
  5887.     GOTO 9882
  5888. 9881    CONTINUE
  5889. C HERE LOOK FOR && FORM. IF NONE SEEN, SKIP THIS
  5890.     IF(FORM(LLA+1).NE.'&'.OR.FORM(LLA+2).NE.'%')GOTO 9882
  5891. C HERE HAVE A FORM &&%FILE,NS,NL
  5892. C SO CLOSE OFF ALL WINDOWS IN USE AND READ IN FIRST LEVEL FILE SEEN.
  5893.     IF(LLVL.EQ.0.OR.LLVLF.EQ.2)GOTO 9884
  5894.     DO 9883 LNN=1,LLVL
  5895.     LNN1=LNN+10
  5896.     CLOSE(LNN1)
  5897. 9883    CONTINUE
  5898. C NOW ALL OPEN UNITS CLOSED
  5899.     LLVLF=2
  5900.     LLVL=0
  5901. 9884    CONTINUE
  5902.     LTST=LLA+3
  5903. C OPEN LLVL
  5904. 9937    CALL GETFNL(FORM(LTST),LSKIP,LLEN)
  5905.     IF(LLEN.LE.0)GOTO 9882
  5906.     LLVL=LLVL+1
  5907.     LLU=LLVL+10
  5908.     IF(LLVL.GT.4)GOTO 9933
  5909. C    OPEN(LLU,NAME=FORM(LTST),TYPE='OLD',
  5910. C     1  ERR=9933)
  5911.     CALL RASSIG(LLU,FORM(LTST))
  5912.     GOTO 9934
  5913. 9933    CONTINUE
  5914.     LLVL=LLVL-1
  5915.     LLU=LLVL+10
  5916.     GOTO 9882
  5917. 9934    CONTINUE
  5918.     LOCOL(LLVL)=LFTMST
  5919.     LENTL(LLVL)=LLEN
  5920.     IF(LSKIP.LE.0)GOTO 9888
  5921.     DO 9887 LL=1,LSKIP
  5922. 9887    READ(LLU,9889,ERR=9901,END=9901)FILINE
  5923. 9889    FORMAT(208A1)
  5924. C8998    FORMAT(1X,208A1)
  5925. 9898    FORMAT(132A1)
  5926.     DO 9908 N=1,208
  5927. 9908    FILINE(N)=Char(32)
  5928. C PUT IN LEADING SPACES INTO FILINE
  5929.     GOTO 9902
  5930. 9901    CONTINUE
  5931.     CLOSE(LLU)
  5932.     LLVL=LLVL-1
  5933.     IF(LLVL.LE.0)GOTO 9880
  5934.     LLU=LLVL+10
  5935. C HIT EOF ON READ, SO BACK UP A LEVEL
  5936. 9902    CONTINUE
  5937. C NOW GO AHEAD & READ... GOT PAST SKIP STUFF.
  5938. 9888    CONTINUE
  5939. C RECORD COL # OVER FOR THIS RECURSION LEVEL
  5940. 9904    IF(LENTL(LLVL).LE.0) GOTO 9901
  5941.     READ(LLU,9889,END=9901,ERR=9901)(FILINE(IV),IV=LOCOL(LLVL),208)
  5942.     LENTL(LLVL)=lentl(llvl)-1
  5943. c update lines left to read in
  5944. C LOOK FOR RECURSIVE CALLS TO DEEPER NESTED FILES TO INCLUDE
  5945.     KKK=ICHAR('&')
  5946.     LTST=INDX(FILINE,KKK)+3
  5947.     LFTMST=LTST-3
  5948. C UPDATE SO IF IT IS A CALL,WE CAN GO HANDLE IT TILL ITS EOF OR A DEEPER CALL
  5949.     IF(LTST.GT.0.AND.LTST.LT.207.AND.FILINE(LTST+1).EQ.'&'
  5950.      1  .AND.FILINE(LTST+2).EQ.'%') GOTO 9937
  5951. C WELL, NOT A DEEPER LEVEL SO JUST GO ON AND READ THIS LEVEL TILL DONE.
  5952.     IF(ICODE.EQ.10)WRITE(8,9889,ERR=9904)FILINE
  5953. c only write 80 chars on ibmpc and its ilk since they screw up on wider.
  5954.     call swrt(filine,80)
  5955. c    WRITE(0,9898,ERR=9904)(FILINE(IVV),IVV=1,132)
  5956.     GOTO 9904
  5957. 9882    CONTINUE
  5958. C HERE HANDLE OLD WINDOW READS IN PROCESS OR JUST EXIT WITHOUT DOING MUCH
  5959.     IF(LLVLF.NE.1)GOTO 9880
  5960. C ONLY HANDLE "OVERLAY" STYLE READS HERE.
  5961. C NORMAL OR-ING IN OF WINDOWS
  5962. C LOOK FOR LUN SUCH THAT J=LOCOL(LUN) INDICATING IT STARTS HERE.
  5963. C READ THIS CELL INTO IT AND FAKE OUT FVLD(1,1) TO GET IT DISPLAYED.
  5964.     IF(LLVL.LE.0)GOTO 9880
  5965.     DO 9912 N=1,LLVL
  5966.     LLM=N+10
  5967.     IF(J.EQ.LOCOL(N))GOTO 9913
  5968. 9912    CONTINUE
  5969.     GOTO 9880
  5970. 9913    CONTINUE
  5971. C NOW READ THE FILE INTO "THIS" CELL (DISPLAY PURPOSES ONLY!)
  5972. C AND FLAG FVLD
  5973.     LENTL(LLM-10)=LENTL(LLM-10)-1
  5974.     IF(LENTL(LLM-10).GT.0)
  5975.      1  READ(LLM,9889,END=9940,ERR=9940)(FORM(IV),IV=1,109)
  5976.     IF(LENTL(LLM-10).GT.0)FVLDTP=-1
  5977.     IF(LENTL(LLM-10).LT.0)GOTO 9940
  5978. C -1 FLAGS THIS AS A "TEXT" CELL DISPLAY.
  5979.     GOTO 9880
  5980. 9940    CONTINUE
  5981.     LENTL(LLM-10)=0
  5982.     LOCOL(LLM-10)=0
  5983.     CLOSE(LLM)
  5984. 9880    CONTINUE
  5985.     RETURN
  5986.     END
  5987. c -h- dspsht.f40    Fri Aug 22 13:04:12 1986    
  5988.     SUBROUTINE DSPSHT(ICODE)
  5989. C COPYRIGHT (C) 1983 GLENN EVERHART
  5990. C ALL RIGHTS RESERVED
  5991.     INCLUDE APARMS.INC
  5992. C DISPLAY SPREAD SHEET ON SCREEN OR IN FILE IF ICODE=10
  5993. C USES UVT100 TO TWEAK THE VT100. NO WRAP IS ASSUMED SO
  5994. C OUTPUT UP TO 132 COLS BY 24 LINES IS OK. ONLY CHECK
  5995. C WIDTH TO ALLOW VT100 LOOKALIKES WITH MORE DISPLAY LINES TOO.
  5996. C NOTE: THROUGHOUT, ROWS ARE ACTUALLY DOWN, COLUMNS ACROSS ON
  5997. C SCREEN. ROW 0 IN DISPLAY IS THE 27 ACCUMULATORS A-Z AND %, WITH
  5998. C % BEING THE LAST-COMPUTED VALUE FROM THE CALC PROGRAM, WHICH
  5999. C KNOWS HOW TO ACCESS THE DATA BUT IS JUST PASSED COMMAND STRINGS
  6000. C FROM THE DISK BASED FILE HERE.
  6001.     CHARACTER*127 CWRK
  6002.     CHARACTER*1 CCWRK(128)
  6003.     InTeGer*4 ICODE,LLU,LLVL,LLVLF
  6004.     EQUIVALENCE(CWRK(1:1),CCWRK(1))
  6005.     InTeGer*4 RRWACT,RCLACT
  6006. C    COMMON/RCLACT/RRWACT,RCLACT
  6007.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  6008.      1  IDOL7,IDOL8
  6009. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  6010. C     1  IDOL7,IDOL8
  6011.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  6012. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  6013.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  6014. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  6015. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  6016. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  6017.     InTeGer*4 KLVL,K3DFG,KCDelt,KRDelt,kpag
  6018. C    COMMON/KLVL/KLVL
  6019.     InTeGer*4 IOLVL,IGOLD
  6020. C    COMMON/IOLVL/IOLVL
  6021. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  6022. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  6023.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  6024.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  6025.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  6026.      3  K3DFG,KCDelt,KRDelt,kpag
  6027. CCC    InTeGer*4 IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  6028. CCC    COMMON/DOLLR/IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  6029. CCC    InTeGer*4 LLCMD,LLDSP
  6030. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  6031. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  6032. C    EXTERNAL INDX
  6033.     CHARACTER*7 PRTLX
  6034.     CHARACTER*1 FORM,FVLD,CMDLIN(132),PRTLIN(132)
  6035.     EQUIVALENCE(PRTLX(1:1),PRTLIN(1))
  6036. C    INTEGER*4 VNLT
  6037.     CHARACTER*1 FVLDTP
  6038.     CHARACTER*1 LBEL(4)
  6039.     CHARACTER*1 LET1,LET2,FORM2(128),NMSH(80)
  6040.     COMMON/NMSH/NMSH
  6041. C FLAG BORDR=1 IF WE WANT TO OMIT BORDERS ON DRAWING
  6042. C THE SCREEN DISPLAY TO A FILE.
  6043.     InTeGer*4 BORDR,TOMT
  6044. C COMMON ICPOS ALLOWS UVT100 ROUTINE ACCESS TO DISPLAYED NUMBERS
  6045. C FOR USES SUCH AS SETTING COLORS...
  6046.     CHARACTER*1 OARRY(100)
  6047.     InTeGer*4 OSWIT,OCNTR
  6048. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  6049. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  6050.     InTeGer*4 IPS1,IPS2,MODFLG
  6051. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  6052.        InTeGer*4 XTCFG,IPSET,XTNCNT
  6053.        CHARACTER*1 XTNCMD(80)
  6054. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  6055. C VARY FLAG ITERATION COUNT
  6056.     INTEGER KALKIT
  6057. C    COMMON/VARYIT/KALKIT
  6058.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  6059.     InTeGer*4 RCMODE,IRCE1,IRCE2
  6060. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  6061. C     1  IRCE2
  6062. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  6063. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  6064. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  6065. C RCFGX ON.
  6066. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  6067. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  6068. C  AND VM INHIBITS. (SETS TO 1).
  6069.     INTEGER*4 FH
  6070. C FILE HANDLE FOR CONSOLE I/O (RAW)
  6071. C    COMMON/CONSFH/FH
  6072.     CHARACTER*1 ARGSTR(52,4)
  6073. C    COMMON/ARGSTR/ARGSTR
  6074.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  6075.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  6076.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  6077.      3  IRCE2,FH,ARGSTR
  6078. CCC    InTeGer*4 IC1POS,IC2POS
  6079. CCC    COMMON/ICPOS/IC1POS,IC2POS
  6080. CCC    InTeGer*4 NULAST,LFVD
  6081. C    INTEGER*4 IOLVL
  6082. C    COMMON/IOLVL/IOLVL
  6083.     InTeGer*4 ICREF,IRREF
  6084. C    COMMON/MIRROR/ICREF,IRREF
  6085.     InTeGer*4 MODPUB,LIMODE
  6086. C    COMMON/MODPUB/MODPUB,LIMODE
  6087.     InTeGer*4 KLKC,KLKR
  6088.     REAL*8 AACP,AACQ
  6089. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  6090.     InTeGer*4 NCEL,NXINI
  6091. C    COMMON/NCEL/NCEL,NXINI
  6092.     CHARACTER*1 NAMARY(20,MROWS)
  6093. C    COMMON/NMNMNM/NAMARY
  6094.     InTeGer*4 NULAST,LFVD
  6095. C    COMMON/NULXXX/NULAST,LFVD
  6096.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  6097.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  6098. CCC    COMMON/NULXXX/NULAST,LFVD
  6099.     REAL*8 XVBLS(1,1),VDSP,VCLC
  6100.     CHARACTER*1 DFE(14)
  6101.     CHARACTER*14 CDFE
  6102.     EQUIVALENCE(CDFE(1:1),DFE(1))
  6103.     DIMENSION FORM(128),FVLD(1,1)
  6104. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  6105. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  6106. C SO INITIALLY IGNORE.
  6107. C
  6108. C ROUTINE IN2AS COMPUTES ASCII CHARACTER NAMES OF SUBSCRIPTS IN1,IN2
  6109. C SO DISPLAY CAN HAVE THEM. IT MUST BE THE INVERSE OF VARSCN.
  6110. C    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  6111. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  6112.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  6113.     COMMON/D2R/NRDSP,NCDSP
  6114.     InTeGer*4 ILNFG,ILNCT,RCF
  6115.     CHARACTER*1 ILINE(106)
  6116.     COMMON/ILN/ILNFG,ILNCT,ILINE
  6117.     INTEGER LENTL(5),LOCOL(5)
  6118.     CHARACTER*1 FILINE(208)
  6119. CCC    CHARACTER*1 OARRY(100)
  6120. CCC    InTeGer*4 OSWIT,OCNTR
  6121. CCC    COMMON/OAR/OSWIT,OCNTR,OARRY
  6122. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  6123.     InTeGer*4 TYPE(1,1),VLEN(9)
  6124.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1)
  6125.     EQUIVALENCE(XVBLS(1,1),VBLS(1,1,1))
  6126.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  6127. CCC    InTeGer *4 FORMFG,RCFGX
  6128. CCC    COMMON/FFGG/FORMFG,RCFGX
  6129. C
  6130. C DISPLAY ARRAY WILL KEEP A COPY OF VARIABLES DISPLAYED AND FORMATS
  6131. C USED LOCALLY WHICH DISPLAY ROUTINE CAN USE TO SEE WHAT ACTUALLY
  6132. C NEEDS TO BE REFRESHED ON SCREEN. DRWV AND DCLV ARE COLS, ROWS OF
  6133. C DISPLAY ACTUALLY USED FOR SCREEN.
  6134.     InTeGer*4 CWIDS(20)
  6135. C CWIDS IS WIDTHS IN CHARACTERS OF COLUMNS ON DISPLAY. NOTE THAT BECAUSE
  6136. C OF PECULIAR INVERSION WHICH I AM TOO LAZY TO CORRECT IT IS DIMENSIONED
  6137. C AS 20 NOT 75.
  6138.     REAL*8 DVS(20,75)
  6139.     INTEGER*4 LDVS(2,20,75)
  6140.     EQUIVALENCE(LDVS(1,1,1),DVS(1,1))
  6141.     COMMON /FVLDC/FVLD
  6142. C    CHARACTER*1 DFMTS(10,20,75)
  6143. C 10 CHARACTERS PER ENTRY.
  6144. C    COMMON/DSPCMN/DVS,DFMTS,CWIDS
  6145.     COMMON/DSPCMN/DVS,CWIDS
  6146. C THISRW,THISCL = CURRENT DISPLAYED LOCS.
  6147.     InTeGer*4 LFTMST
  6148.     InTeGer*4 THISRW,THISCL
  6149. C NOTE ROWS ARE DOWN, COLS ACROSS INTERNALLY.
  6150. C COLUMN 2 = NUMBERS. DISPLAY COLS 2-22 WITH COL 1=TITLE
  6151. C COL 23,24 FOR COMMANDS.(23 (PARAMETER) ACTUALLY.)
  6152. C ROW OFFSET BY 6 FOR NUMBERS.
  6153. C
  6154. C MAINTAIN AN "INITIALIZED" BITMAP HERE TO USE TO AVOID GOING TO
  6155. C FVLD.
  6156. C    CHARACTER*1 IBITMP
  6157. C    DIMENSION IBITMP(2258)
  6158. C    COMMON/INITD/IBITMP
  6159. C NOTE BITMAP IS ZEROED IN SPREDSHT MAIN PROGRAM (OR AT SAVE CMD)
  6160. C AND IS SET HERE (AND HERE ONLY). ONLY USED HERE TOO...
  6161.     character*100 fwt
  6162. C    CHARACTER*1 LBITS(8)
  6163. CC    DATA LBITS/1,2,4,8,16,32,64,128/
  6164. C    LBITS(1)=1
  6165. C    LBITS(2)=2
  6166. C    LBITS(3)=4
  6167. C    LBITS(4)=8
  6168. C    LBITS(5)=16
  6169. C    LBITS(6)=32
  6170. C    LBITS(7)=64
  6171. C    LBITS(8)=128
  6172.     IF(ICODE.NE.10)GOTO 3000
  6173.     CALL UVT100(1,LLCMD,1)
  6174.     CALL UVT100(12,2,0)
  6175.     call Vwrt('Enter Print File Spec, / after to omit borders>',47)
  6176.     if(iolvl.ne.11)READ(IOLVL,26,END=8884,ERR=8884)FORM2
  6177.     if(iolvl.eq.11)call vget(form2,128)
  6178. 26    FORMAT(128A1)
  6179. C FIND SIZE OF LINE READ IN
  6180.     DO 750 N=1,128
  6181.     ISZ=129-N
  6182.     IF(FORM2(N).GT.' ')GOTO 751
  6183. 750    CONTINUE
  6184. 751    CONTINUE
  6185.     ISZ=ISZ+1
  6186.     ISZ=MIN0(127,ISZ)
  6187.     FORM2(ISZ+1)=0
  6188.     BORDR=0
  6189.     TOMT=0
  6190.     DO 4111 N=1,ISZ
  6191. C IF FILENAME HAS / AFTERWARDS, OMIT BORDER
  6192.     IF(FORM2(N).EQ.'/')BORDR=1
  6193. C NULL OUT THE / SO THAT FILENAME WILL PARSE CORRECTLY.
  6194.     IF(FORM2(N).EQ.'/')FORM2(N)=0
  6195.     IF(FORM2(N).EQ.'%')TOMT=1
  6196. 4111    CONTINUE
  6197. C    OPEN(8,FILE=FORM2,RECL=132,STATUS='NEW')
  6198.     CALL WASSIGN(8,FORM2)
  6199.     KSHEET=0
  6200.     IF(K3DFG.LE.0)GOTO 2890
  6201.     LR=NRDSP(1,1)
  6202.     LC=NCDSP(1,1)
  6203.     CALL GETSHT(LR,LC,KSHEET)
  6204.     IF(KSHEET.EQ.0)GOTO 2890
  6205.     DO 27 N=1,132
  6206. 27    PRTLIN(N)=Char(32)
  6207.     WRITE(PRTLX(1:7),1891)ksheet
  6208. c    ENCODE(7,1891,PRTLIN)KSHEET
  6209.     GOTO 3666
  6210. 2890    CONTINUE
  6211.     DO 9127 N=1,132
  6212. 9127    PRTLIN(N)=Char(32)
  6213.     WRITE(PRTLX(1:7),2)
  6214. C    ENCODE(7,2,PRTLIN)
  6215.     GOTO 3666
  6216. 3000    CONTINUE
  6217.     NULAST=-4
  6218. 3666    CONTINUE
  6219.     CALL UVT100(13,0,0)
  6220.     IF(TOMT.EQ.0.AND.ICODE.EQ.10)WRITE(8,17)NMSH
  6221.     IF(ICODE.EQ.10)GOTO 2000
  6222.     IF(ICODE.NE.2)GOTO 1000
  6223. C DRAW LABELS FIRST
  6224.     CALL UVT100(1,1,1)
  6225.     CALL UVT100(12,2,0)
  6226.     IF(ICODE.NE.10)call swrt(nmsh,80)
  6227.     CALL UVT100(1,2,1)
  6228.     CALL UVT100(12,2,0)
  6229. C ERASE TOP LINE, START AT COL 7
  6230.     KSHEET=0
  6231.     IF(K3DFG.LE.0)GOTO 1890
  6232.     LR=NRDSP(1,1)
  6233.     LC=NCDSP(1,1)
  6234.     CALL GETSHT(LR,LC,KSHEET)
  6235.     IF(KSHEET.EQ.0)GOTO 1890
  6236.     write(fwt(1:7),1891)ksheet
  6237.     call swrt(fwt,7)
  6238. c    WRITE(6,1891)KSHEET
  6239. 1891    FORMAT('PG=',I4)
  6240.     GOTO 2000
  6241. 1890    CONTINUE
  6242.     call swrt('ROW\COL',7)
  6243. 2    FORMAT('ROW\COL')
  6244. C NOTE EXACTLY 7 CHARACTERS IN FORMAT #2
  6245. 2000    CONTINUE
  6246.     J=8
  6247.     CALL UVT100(13,7,0)
  6248.     DO 1 N1=1,DRWV
  6249.     LR=NRDSP(N1,1)
  6250. C NOTE PHYS SHEET OFFSET BY 1 (SEE VARSCN)
  6251. C DISPLAY SHEET NUMBERS START AT 1
  6252.     IF(ICODE.NE.10)CALL UVT100(1,2,J)
  6253.     IF(KSHEET.GT.0.AND.LR.GE.NRDSP(1,1).AND.
  6254.      1   (LR-(KSHEET)*KCDELT).GE.1) LR=LR-(KSHEET)*KCDELT
  6255.     CALL IN2AS(LR,LBEL)
  6256.     IF(ICODE.EQ.10)GOTO 2020
  6257.     write(fwt(1:100),3)LBEL
  6258.     CALL SWRT(fwt(1:100),4)
  6259. c    WRITE(0,3)LBEL
  6260. 3    FORMAT(4A1)
  6261.     IF(LBEL(4).EQ.' '.AND.LBEL(3).EQ.' ')CALL UVT100(1,2,J+2)
  6262.     IF(LBEL(4).EQ.' '.AND.LBEL(3).NE.' ')CALL UVT100(1,2,J+3)
  6263.     write(fwt(1:100),7)n1
  6264.     call swrt(fwt(1:100),3)
  6265. 7    FORMAT('=',I2)
  6266.     GOTO 2030
  6267. 2020    CONTINUE
  6268.     IF((J+CWIDS(N1)-7).GT.121)GOTO 2030
  6269.     ICWD=MAX0(7,CWIDS(N1))
  6270.     WRITE(CWRK(1:127),2021,ERR=2030)LBEL,N1
  6271.     DO 752 N=1,ICWD
  6272.     PRTLIN(J-1+N)=CCWRK(N)
  6273. 752    CONTINUE
  6274. C    ENCODE(ICWD,2021,PRTLIN(J),ERR=2030),LBEL,N1
  6275. 2021    FORMAT(4A1,'=',I2)
  6276. 2030    CONTINUE
  6277.     J=J+CWIDS(N1)
  6278.     IF(J.GT.132)GOTO 40
  6279. 1    CONTINUE
  6280. 40    CONTINUE
  6281. C NOW COL LBLS DONE
  6282. C DO NUMBERS ACROSS LEFT.
  6283. C ONLY DO SO ON SCREEN.
  6284.     IF(BORDR.EQ.0.AND.ICODE.EQ.10)WRITE(8,18)PRTLIN
  6285.     DO 2031 KKK=1,132
  6286.     FILINE(KKK)=Char(32)
  6287. 2031    PRTLIN(KKK)=Char(32)
  6288.     IF(ICODE.EQ.10)GOTO 1000
  6289.     CALL UVT100(13,7,0)
  6290.     MCX=MIN0(LLCMD-1,DCLV)+2
  6291. C    LLVL=0
  6292. C ROWS ARE JUST OFFSET...NO MONKEY BUSINESS.
  6293.     DO 6 N1=3,MCX
  6294.     M1=N1-2
  6295.     LC=NCDSP(1,M1)-1
  6296. C N1=DISPLAY ROW
  6297.     CALL UVT100(1,N1,1)
  6298. C ADJUST DISPLAY LABELS FOR PAGE
  6299.     IF(KSHEET.GT.0.AND.LC.GE.(NCDSP(1,1)-1).AND.
  6300.      1   (LC-KSHEET*KRDELT).GE.1)LC=LC-KSHEET*KRDELT
  6301.     write(fwt(1:100),8)lc
  6302.     call swrt(fwt(1:100),6)
  6303. 8    FORMAT(I5,'>')
  6304. 6    CONTINUE
  6305. C NOW DISPLAY VALUES.
  6306. 1000    CONTINUE
  6307.     CALL UVT100(13,0,0)
  6308. C main screen display loop here.
  6309.     If (NCEL.eq.0) GOTO 1011
  6310.     DO 10 N2=1,DCLV
  6311.     JP=8
  6312.     JPL=125
  6313.     DO 110 N1=1,DRWV
  6314.     M1=NRDSP(N1,N2)
  6315.     M2=NCDSP(N1,N2)
  6316. C M1,M2 = PHYS SHEET COORDS OF WHAT IS DISPLAYED.
  6317.     M2M1=M2-1
  6318.     IF(BORDR.EQ.0.AND.ICODE.EQ.10)WRITE(PRTLX(1:7),8)M2-1
  6319. C *** OMIT DISPLAY IF FVLD=0 ***
  6320. C
  6321.     CALL FVLDGT(M1,M2,FVLD(1,1))
  6322.     IF((ICHAR(FVLD(1,1)).EQ.0).AND.ICODE.NE.2.AND.ICODE.NE.
  6323.      1  10.AND.IDOL4.EQ.0) GOTO 100
  6324. C ******************************
  6325.     VDSP=DVS(N1,N2)
  6326.     CALL XVBLGT(M1,M2,VCLC)
  6327. C    VCLC=XVBLS(M1,M2)
  6328. C SEE IF DISPLAYED AND CALCULATED NUMBERS ARE IDENTICAL.
  6329. C ONLY DISPLAY IF CHANGED.
  6330.     IF(IDOL4.NE.0)GOTO 620
  6331.     IF(VDSP.EQ.VCLC.AND.ICODE.NE.2.AND.ICODE.NE.10)GOTO 100
  6332. 620    IC1POS=M1
  6333.     IC2POS=M2
  6334. C FALL THRU HERE IF WE NEEDTO DISPLAY A NUMBER IN ROW 3+N2, COL N1
  6335. C THEN RE-ESTABLISH FORMAT, ETC.
  6336.     M23=N2+2
  6337.     J=8
  6338.     DO 11 N11=1,N1
  6339. C GET THE COORDS OF OUR CELL.
  6340. 11    J=J+CWIDS(N11)
  6341.     J=J-CWIDS(N1)
  6342. C CURRENT CHARACTER COL NUMBER IS NOW J.
  6343. C    CALL UVT100(1,M23,J)
  6344. C    IRX=(M2-1)*60+M1
  6345.     CALL REFLEC(M2,M1,IRX)
  6346. C
  6347. C GET FORMULA IN NOW
  6348.     CALL WRKFIL(IRX,CWRK(1:127),0)
  6349.     CALL CE2A(CWRK(1:127),FORM)
  6350. C CONVERT ENCODED FORMS TO REGULAR ASCII
  6351. C    READ(7'IRX)FORM
  6352. C ALLOW FOR FVLD TO HAVE CONSTANT VS FORMULA SIGNIFICANCE
  6353.     IF(JCHAR(FORM(119)).LT.-1)FORM(119)=Char(253)
  6354.     IF(JCHAR(FORM(119)).GT.1)FORM(119)=Char(3)
  6355. C
  6356. c try & omit reset here... could mess other places up.
  6357. cC FVLD VALUES OF 2 INDICATE ALREADY-COMPUTED CONSTANTS.DON'T
  6358. cC FORCE THEM TO BE REDONE. OTHERWISE DO FILL IN HOWEVER.
  6359. c    CALL FVLDGT(M1,M2,FVLD(1,1))
  6360. c    IF(ICHAR(FVLD(1,1)).NE.2)CALL FVLDST(M1,M2,FORM(119))
  6361. cC    FVLD(M1,M2)=FORM(119)
  6362. cC    IF(FORM(120).LE.0)CALL FVLDST(M1,M2,char(0))
  6363.     CALL FVLDGT(M1,M2,FVLD(1,1))
  6364.     FVLDTP=FVLD(1,1)
  6365. C HANDLE FILE INCLUSION IN SUBROUTINE...
  6366.     IF (IDOL4.NE.0)CALL DSPFIL(ICODE,FORM,FORM2,FVLDTP,LFTMST,
  6367.      1  LENTL,LOCOL,FILINE,LLVL,LLU,LLVLF,J)
  6368. C NOTE WE CALL DSPFIL SO IT CAN BE OVERLAIN AND LET THE REST
  6369. C OF DSPSHT STAY RESIDENT. (SHOULD SPEED THINGS UP MOST OF
  6370. C THE TIME)...
  6371. C THIS SETTING OF FVLD ALLOWS THE Q OPTION TO WORK.
  6372.     IF(ICHAR(FVLDTP).NE.0)CALL UVT100(1,M23,J)
  6373. 13    CONTINUE
  6374.     CALL XVBLGT(M1,M2,DVS(N1,N2))
  6375. C    DVS(N1,N2)=XVBLS(M1,M2)
  6376.     IF(ICHAR(FVLDTP).EQ.0)GOTO 100
  6377.     IF(FORMFG.LE.0.AND.JCHAR(FVLDTP).GE.0)GOTO 756
  6378.     DO 757 N=1,100
  6379. 757    FORM2(N)=FORM(N)
  6380. 756    CONTINUE
  6381. C     1  ENCODE(100,17,FORM2)(FORM(II),II=1,100)
  6382. 17    FORMAT(1X,80A1)
  6383.     IF(FORMFG.NE.0)GOTO 4321
  6384.     DO 6304 KKKK=1,9
  6385.     KKKKK=ICHAR(FORM(KKKK+119))
  6386. C    KKKKK=DFMTS(KKKK,N1,N2)
  6387. 6304    DFE(KKKK+1)=Char(MAX0(32,KKKKK))
  6388.     DFE(11)=Char(32)
  6389.     DFE(1)='('
  6390.     DFE(12)=' '
  6391. c omit any \ formats from dfe since encode fouls up with them.
  6392.     DFE(13)=' '
  6393.     DFE(14)=')'
  6394.     CALL TYPGET(M1,M2,TYPE(1,1))
  6395. c    IF(TYPE(1,1).EQ.2.AND.JCHAR(FVLDTP).GT.0)
  6396. c     1  WRITE(CWRK(1:127),CDFE(1:14),ERR=4321)DVS(N1,N2)
  6397. c    IF(TYPE(1,1).NE.2.AND.JCHAR(FVLDTP).GT.0)
  6398. c     1  WRITE(CWRK(1:127),CDFE(1:14),ERR=4321)LDVS(1,N1,N2)
  6399.     IF(TYPE(1,1).EQ.2.AND.JCHAR(FVLDTP).GT.0)
  6400.      1  WRITE(CWRK(1:127),DFE,ERR=4321)DVS(N1,N2)
  6401.     IF(TYPE(1,1).NE.2.AND.JCHAR(FVLDTP).GT.0)
  6402.      1  WRITE(CWRK(1:127),DFE,ERR=4321)LDVS(1,N1,N2)
  6403.     IF(JCHAR(FVLDTP).LE.0)GOTO 4321
  6404.     DO 758 N=1,100
  6405. 758    FORM2(N)=CCWRK(N)
  6406. 4321    CONTINUE
  6407.     KWID=CWIDS(N1)
  6408. C  *** FIND OUT HOW MUCH ROOM THERE IS NOW. WE KNOW WHERE WE'RE DISPLAYING, SO
  6409. C  *** ALLOW NULL CELLS TO BE SHOWN PROVIDED WE ARE:
  6410. C  1. DISPLAYING TEXT IN THE CELL, OR
  6411. C  2. IN VIEW FORMULA MODE, AND THE NEXT CELL(S) OVER ARE NULL (FVLD=0)
  6412.     IF(FORMFG.EQ.0.AND.JCHAR(FVLDTP).GE.0)GOTO 8444
  6413.     III=N1+1
  6414.     IF(III.GT.DRWV)GOTO 8446
  6415.     DO 8445 II=III,DRWV
  6416. C FOLLOW ALONG WITH THE DISPLAY'S MAPPING TO SHEET.
  6417.     IIII=NRDSP(II,N2)
  6418.     IIIII=NCDSP(II,N2)
  6419.     CALL FVLDGT(IIII,IIIII,FVLD(1,1))
  6420.     IF(ICHAR(FVLD(1,1)).NE.0)GOTO 8444
  6421.     KWID=KWID+CWIDS(II)
  6422. 8445    CONTINUE
  6423. 8446    CONTINUE
  6424. C TEST IF LAST CELL IS NULL
  6425. 8444    CONTINUE
  6426.     KWID=MIN0(KWID,JPL)
  6427. C ****** END OF MODS FOR PRINTING INTO ADJACENT NULL CELLS.
  6428.     IF(ICODE.NE.10)CALL SWRT(FORM2,KWID)
  6429.     IF(ICODE.NE.10)GOTO 100
  6430.     IF(JPL-KWID.LT.0)GOTO 115
  6431.     DO 759 II=1,KWID
  6432.     IIII=JP+II-1
  6433. 759    PRTLIN(IIII)=FORM2(II)
  6434. C    ENCODE(KWID,17,PRTLIN(JP),ERR=100)(FORM2(II),II=1,KWID)
  6435. 100    CONTINUE
  6436. 115    CONTINUE
  6437. C HERE KEEP TRACK OF AMOUNT PRINTED.
  6438.     JP=JP+CWIDS(N1)
  6439.     JPL=JPL-CWIDS(N1)
  6440. 110    CONTINUE
  6441.     IF(ICODE.NE.10)GOTO 10
  6442.     DO 634 KKKQ=1,132
  6443.     IF(ICHAR(PRTLIN(KKKQ)).LT.32)PRTLIN(KKKQ)=Char(32)
  6444. 634    CONTINUE
  6445.     WRITE(8,18)(PRTLIN(II),II=1,JP)
  6446. 18    FORMAT(1X,100A1,34A1)
  6447.     DO 19 LN1=1,132
  6448. 19    PRTLIN(LN1)=Char(32)
  6449. 10    CONTINUE
  6450. 1011    Continue
  6451.     IF(ICODE.EQ.10)CLOSE(8)
  6452.     IF(IDOL4.EQ.0)RETURN
  6453.     DO 9915 N=1,4
  6454.     LLU=N+10
  6455.     CLOSE(LLU)
  6456. 9915    CONTINUE
  6457.     LLVL=0
  6458. 8884    RETURN
  6459.     IOLVL=11
  6460.     CLOSE(3)
  6461. c    CLOSE(11)
  6462. c    OPEN(UNIT=11,FILE='CON:0/0/100/100/Analy Command')
  6463.     RETURN
  6464.     END
  6465.     SUBROUTINE GETSHT(LR,LC,KSHEET)
  6466. c FIGURE CORRECT SHEET, ENSURING THAT THE LR,LC PAIR IS
  6467. c SENSIBLY WITHIN IT.
  6468.     Include aparms.inc
  6469. c    INCLUDE 'VKLUGPRM.FTN'
  6470.     InTeGer*4 RRWACT,RCLACT
  6471. C    COMMON/RCLACT/RRWACT,RCLACT
  6472.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  6473.      1  IDOL7,IDOL8
  6474. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  6475. C     1  IDOL7,IDOL8
  6476.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  6477. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  6478.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  6479. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  6480. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  6481. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  6482.     InTeGer*4 KLVL,K3DFG,KCDelt,KRDelt,kpag
  6483. C    COMMON/KLVL/KLVL
  6484.     InTeGer*4 IOLVL,IGOLD
  6485. C    COMMON/IOLVL/IOLVL
  6486. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  6487. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  6488.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  6489.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  6490.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  6491.      3  K3DFG,KCDelt,KRDelt,kpag
  6492.     KSHEET=0
  6493.     KK1=MRC
  6494.     KK2=MRC
  6495.     IF(KRDELT.GT.0)KK1=(LC-2)/KRDELT
  6496.     IF(KCDELT.GT.0)KK2=(LR-1)/KCDELT
  6497.     KK=MIN0(KK1,KK2)
  6498.     IF(KK.GE.(MRC-100))GOTO 222
  6499. C IF BOTH DELTAS ARE ZERO DON'T TOUCH ANYTHING.
  6500.     KSHEET=MAX0(KK,0)
  6501. C KSHEET NONZERO FLAGS WE MAKE THE MOD
  6502.     IF(LR.LT.KSHEET*KCDELT)GOTO 2220
  6503.     IF((LC-1).LT.KSHEET*KRDELT)GOTO 2220
  6504. 222    CONTINUE
  6505.     GOTO 2221
  6506. 2220    CONTINUE
  6507.     KSHEET=0
  6508. 2221    CONTINUE
  6509.     RETURN
  6510.     END
  6511. c -h- errcx.for    Fri Aug 22 13:08:07 1986    
  6512.     SUBROUTINE ERRCX (RETCD)
  6513. C COPYRIGHT (C) 1983 GLENN EVERHART
  6514. C ALL RIGHTS RESERVED
  6515. C 60=MAX REAL ROWS
  6516. C 301=MAX REAL COLS
  6517. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  6518. C VBLS AND TYPE DIMENSIONED 60,301
  6519. C **************************************************
  6520. C *                                                *
  6521. C *            SUBROUTINE ERRCX                    *
  6522. C *                                                *
  6523. C **************************************************
  6524. C
  6525. C
  6526. C THIS SUBROUTINE DOES INITIAL SYNTAX CHECKING ON THE INPUT
  6527. C LINE. THE CHECKS MAKE SURE THAT PARENTHESES ARE BALANCED
  6528. C AND THAT THE EQUAL SIGN IS NOT MISUSED.
  6529. C
  6530. C RETCD     MEANING
  6531. C
  6532. C   1        NO ERRORS DETECTED
  6533. C   2        ERROR FOUND
  6534. C
  6535. C
  6536. C
  6537. C
  6538. C   MODIFICATION CLASSES: M1
  6539. C
  6540. C
  6541. C
  6542. C
  6543. C ERRCX CALLS ERRMSG WHICH PRINTS ERROR MESSAGES.
  6544. C
  6545. C
  6546. C
  6547. C ERRCX IS CALLED BY CALC
  6548. C
  6549. C
  6550. C
  6551. C   VARIABLE       USE
  6552. C
  6553. C    ALPHA(27)    HOLDS LEGAL VARIABLE NAMES: ALPHABETIC
  6554. C                 OR THE CHARACTER %.
  6555. C    BLANK        ' '
  6556. C    I,J          HOLDS TEMPORARY VALUES.
  6557. C    LAST         HOLDS A CODE WHEN LOOKING FOR ERRORS INVOLVING
  6558. C                 THE EQUAL SIGN.
  6559. C    LEND         LAST NON-BLANK CHARACTER IN LINE(80).
  6560. C    LPAR         '('
  6561.  
  6562. C    PARCNT       0 IF PARENTHESIS ENCOUNTERED BALANCE. INCREASED
  6563. C                 BY 1 FOR EVERY LEFT PARENTHESIS, DECREASED BY
  6564. C                 BY 1 FOR EVERY RIGHT PERENTHESIS FOUND.
  6565. C    RETCD        HOLDS RETURN CODE. 1=O.K.  2=ERROR
  6566. C    RPAR         ')'
  6567. C
  6568. C
  6569. C
  6570. C    MODIFIED    REASON
  6571. C
  6572. C    18-MAY-1981    WHEN CHECKING FOR BALANCED PARENTHESIS, DON'T
  6573. C            INCLUDE THOSE THAT ARE PRECEEDED BY A SINGLE QUOTE
  6574. C            (CODE AT DO 100) (PB)
  6575. C
  6576. C
  6577. C
  6578. C    SUBROUTINE ERRCX (RETCD)
  6579.     InTeGer*4 LEVEL,NONBLK,LEND
  6580.     InTeGer*4 RETCD,PARCNT,VIEWSW,BASED
  6581.     InTeGer*4 I,J,LAST
  6582. C
  6583.     CHARACTER*1 ALPHA(27),COMMA,BLANK,RPAR,LPAR,EQ
  6584.     CHARACTER*1 LINE(80)
  6585.     CHARACTER*1 QUOTE
  6586.     COMMON LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  6587.     COMMON /CONS/ALPHA,COMMA,BLANK,RPAR,LPAR,EQ
  6588.     DATA QUOTE/''''/
  6589. C
  6590. C
  6591. C
  6592.     RETCD=1
  6593. C
  6594. C **************************************************
  6595. C ******  MAKE SURE PARENTHESIS ARE BALANCED  ******
  6596. C **************************************************
  6597. C
  6598.     PARCNT=0
  6599.     I=NONBLK
  6600. 4100    CONTINUE
  6601. C    DO 100 I=NONBLK,LEND
  6602. C SKIP VARIABLE NAMES WHICH ARE IN ENCODED FORM
  6603.     IF(ICHAR(LINE(I)).NE.255)GOTO 4101
  6604.     I=I+2
  6605.     GOTO 100
  6606. C AT 100 ADD 1 MORE TO I, SKIPPING CRUFT.
  6607. 4101    CONTINUE
  6608.     IF (LINE(I).EQ.LPAR) GOTO 50
  6609.     IF (LINE(I).EQ.RPAR) GOTO 80
  6610.     GOTO 100
  6611. C
  6612. C ENCOUNTERED A LEFT PARENTHESIS, COUNT IT ONLY IF PRECEEDING
  6613. C CHARACTER IS NOT A SINGLE QUOTE
  6614. 50    IF(I.EQ.NONBLK) GOTO 60
  6615.     IF(LINE(I-1).EQ.QUOTE) GOTO 100
  6616. 60    PARCNT=PARCNT+1
  6617.     GOTO 100
  6618. C
  6619. C ENCOUNTERED A RIGHT PARENTHESIS, COUNT IT ONLY IF PRECEEDING
  6620. C CHARACTER IS NOT A SINGLE QUOTE
  6621. 80    IF(I.EQ.NONBLK) GOTO 90
  6622.     IF(LINE(I-1).EQ.QUOTE) GOTO 100
  6623. 90    PARCNT=PARCNT-1
  6624.     IF(PARCNT.LT.0)GOTO 160
  6625. 100    CONTINUE
  6626.     I=I+1
  6627.     IF(I.LE.LEND)GOTO 4100
  6628. C
  6629.     IF (PARCNT.EQ.0) GOTO 200
  6630. C
  6631. C
  6632. C UNBALANCED PARENTHESIS
  6633.     I=6
  6634. 140    CALL ERRMSG(I)
  6635. 150    RETCD=2
  6636.     RETURN
  6637. C
  6638. C
  6639. C ILLEGAL EXPRESSION LIKE ')))X((('
  6640. 160    I=8
  6641.     GOTO 140
  6642. C
  6643. C
  6644. C **************************************************
  6645. C *********   = SIGN SYNTAX CHECK   ****************
  6646. C **************************************************
  6647. C
  6648. 200    CONTINUE
  6649. C
  6650. C
  6651. C  ALLOW A=B=C+2
  6652. C  MAY ONLY ASSIGN VALUES TO SINGLE UNSIGNED VARIABLES.
  6653. C  ALSO CATCH  =A
  6654. C       AND    A==B
  6655. C
  6656. C  LAST    =  0    FIRST CHAR OR FOUND =
  6657. C       1    1 ALPHA CHARACTER
  6658. C       2    MORE THAN 1 ALPHA OR
  6659. C        ENCOUNTERED NON-ALPHA
  6660. C        (BUT NOT = OR BLANK)
  6661. C
  6662. C
  6663.     LAST=0
  6664.     I=NONBLK
  6665. 271    CONTINUE
  6666. C    DO 270 I=NONBLK,LEND
  6667.     IF (LINE(I).EQ.BLANK) GOTO 270
  6668.     IF (LINE(I).EQ.EQ) GOTO 230
  6669. C
  6670. C
  6671. C  LOOK FOR ALPHA
  6672. C    DO 220 J=1,27
  6673. C    IF (LINE(I).EQ.ALPHA(J)) GOTO 240
  6674. C220    CONTINUE
  6675. C LOOK FOR ANY VARIABLE NAME (NOT JUST ALPHA) (GCE)
  6676.     LLND=LEND
  6677.     CALL VARSCN(LINE,I,LLND,LSTCHR,ID1,ID2,IVALID)
  6678.     IF(IVALID.EQ.0) GOTO 220
  6679.     I=LSTCHR
  6680.     IF(LSTCHR.LT.LEND)I=LSTCHR-1
  6681. C IF WE GET A GOOD VARIABLE NAME POINT AT ITS END AND GO SAY WE'RE OK.
  6682.     GOTO 240
  6683. 220    CONTINUE
  6684. C
  6685. C
  6686. C   MORE THAN 1 ALPHA OR ENCOUNTERED NON-ALPHA
  6687. C (BUT NOT = SIGN OR BLANK)
  6688. 225    LAST=2
  6689.     GOTO 270
  6690. C
  6691. C
  6692. C = SIGN ENCOUNTERED
  6693. 230    IF (LAST.EQ.1) GOTO 235
  6694. C
  6695. C ILLEGAL USE OF = SIGN
  6696.     GOTO 290
  6697. C
  6698. C HAD 1 ALPHA CHARACTER FOLLOWED BY = SIGN
  6699. 235    LAST=0
  6700.     GOTO 270
  6701. C
  6702. C ENCOUNTERED A VARIABLE NAME (1 CHARACTER)
  6703. 240    IF (LAST.EQ.2) GOTO 270
  6704.     IF (LAST.EQ.1) GOTO 225
  6705. C
  6706. C
  6707. C EXACTLY 1 ALPHA CHARACTER EITHER AS FIRST CHARACTER
  6708. C ENCOUNTERED OR AS THE 1ST CHARACTER AFTER AN = SIGN.
  6709.     LAST=1
  6710. 270    CONTINUE
  6711.     I=I+1
  6712.     IF(I.LE.LEND) GOTO 271
  6713. C *****&&&&&  SIMULATE DO LOOP TO ALLOW MONKEYING WITH INDEX INSIDE.
  6714. C WHICH IS DONE SO WE CAN HUNT FOR VARIABLES BY NAME...
  6715. C
  6716. C
  6717. C <<<<<<<<<<<< ADD ADDITIONAL CHECKS HERE >>>>>>>>>>
  6718. C
  6719.     RETURN
  6720. C
  6721. C
  6722. C ILLEGAL USE OF = SIGN
  6723. 290    I=17
  6724.     GO TO 140
  6725.     END
  6726. c -h- errmsg.for    Fri Aug 22 13:08:07 1986    
  6727.     SUBROUTINE ERRMSG (IMSG)
  6728. C COPYRIGHT (C) 1983 GLENN EVERHART
  6729. C ALL RIGHTS RESERVED
  6730. C 60=MAX REAL ROWS
  6731. C 301=MAX REAL COLS
  6732. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  6733. C VBLS AND TYPE DIMENSIONED 60,301
  6734. C **************************************************
  6735. C *                                                *
  6736. C *       SUBROUTINE  ERRMSG(MSG)                  *
  6737. C *                                                *
  6738. C **************************************************
  6739. C
  6740. C
  6741. C PRINTS OUT ERROR MESSAGES AS REQUESTED BY CODE IN MSG.
  6742. C
  6743. C ERRMSG IS CALLED BY THE FOLLOWING ROUTINES:
  6744. C
  6745. C AT
  6746. C BASCNG
  6747. C CALBIN
  6748. C CALC
  6749. C CALUN
  6750. C CMND
  6751. C CONTYP
  6752. C DECLR
  6753. C ERRCX
  6754. C INPOST
  6755. C MULADD
  6756. C MULDIV
  6757. C MULMUL
  6758. C NEXTEL
  6759. C POSTVL
  6760. C VAROUT
  6761. C ZNEG
  6762. C
  6763. C
  6764. C    VARIABLE    USE
  6765. C
  6766. C   I         TEMPORARY VARIABLE TO AVOID SIDE-EFFECT WITH CALLS
  6767. C             THAT USE A CONSTANT FOR THE ARGUMENT.
  6768. C   MSG       ERROR MESSAGE CODE.
  6769. C
  6770. C
  6771. C
  6772. C  NOTE: USE CODE 25 FOR UNKNOWN CAUSES.
  6773. C
  6774. C
  6775. C
  6776. C    SUBROUTINE ERRMSG (MSG)
  6777. C
  6778.     InTeGer*4 IMSG,I
  6779.     CHARACTER*20 MSG(27)
  6780.     CHARACTER*8 EMSG
  6781.     DATA EMSG/'*ERROR* '/
  6782.     DATA MSG(1)/'1ST CHAR ILLEGAL   '/
  6783.     DATA MSG(2)/'INDIR.NEST OVFLOW  '/
  6784.     DATA MSG(3)/'UNIDENTIFIED CMND  '/
  6785.     DATA MSG(4)/'ILL CHR IN VBL LIST'/
  6786.     DATA MSG(5)/'VBLS NT SEP W/COMMA'/
  6787.     DATA MSG(6)/'UNBAL PARENTHESIS  '/
  6788.     DATA MSG(7)/'STACK 1 OVERFLOW   '/
  6789.     DATA MSG(8)/'ILLEGAL EXPRESSION '/
  6790.     DATA MSG(9)/'STACK 2 OVERFLOW   '/
  6791.     DATA MSG(10)/'FCN ILL W/INT ARGS '/
  6792.     DATA MSG(11)/'FCN ILL W/MPR ARGS '/
  6793.     DATA MSG(12)/'FCN ILL W/ASCI ARG '/
  6794.     DATA MSG(13)/'FCN ILL W/REAL ARG '/
  6795.     DATA MSG(14)/'SQRT OF NEG NUMBER '/
  6796.     DATA MSG(15)/'MP EXP W/NEG POWER '/
  6797.     DATA MSG(16)/'UNDEFINED VARIABLE '/
  6798.     DATA MSG(17)/'ILL USE OF = SIGN  '/
  6799.     DATA MSG(18)/'UNIDENTIFIED FUNCT '/
  6800.     DATA MSG(19)/'ILLEGAL BASE SPEC  '/
  6801.     DATA MSG(20)/'ILLEGAL CHARACTER  '/
  6802.     DATA MSG(21)/'. OK ONLY W/BASE 10'/
  6803.     DATA MSG(22)/'OVER 19 DIGIT MP NO'/
  6804.     DATA MSG(23)/'DIVIDE BY ZERO ERR '/
  6805.     DATA MSG(24)/'ILL REAL EXP FIELD '/
  6806.     DATA MSG(25)/'WEIRD BUG. CALL GE.'/
  6807.     DATA MSG(26)/'ILLEG CONVERSION   '/
  6808.     DATA MSG(27)/'READ ERROR         '/
  6809. C
  6810. C
  6811.     CALL UVT100(1,1,10)
  6812. C WRITE "*ERROR*" FOLLOWED BY MESSAGE TEXT/
  6813.     CALL SWRT(EMSG,8)
  6814.     I=IMSG
  6815.     IF(I.LE.0.OR.I.GT.27)I=25
  6816.     CALL SWRT(MSG(I),20)
  6817. C
  6818. 99    RETURN
  6819.     END
  6820. c -h- flip.for    Fri Aug 22 13:09:05 1986    
  6821.     SUBROUTINE FLIP (VEC,SIZE,PT)
  6822. C COPYRIGHT (C) 1983 GLENN EVERHART
  6823. C ALL RIGHTS RESERVED
  6824. C 60=MAX REAL ROWS
  6825. C 301=MAX REAL COLS
  6826. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  6827. C VBLS AND TYPE DIMENSIONED 60,301
  6828. C **************************************************
  6829. C *                                                *
  6830. C *         SUBROUTINE FLIP(VEC,SIZE,PT)           *
  6831. C *                                                *
  6832. C **************************************************
  6833. C
  6834. C
  6835. C  FLIPS THE NON-ZERO DIGITS UP TO PT IN VECTOR VEC IN REVERSE
  6836. C  ORDER.  USED TO PLACE NUMBERS IN PROPER ORDER INTO VBLS THAT
  6837. C  HAVE BEEN READ IN HIGH ORDER FIRST.
  6838. C
  6839. C FLIP IS CALLED BY NEXTEL
  6840. C
  6841. C   VARIABLE   USE
  6842. C
  6843. C     H1     TEMPORARILY HOLDS A CHARACTER*1 VALUE
  6844. C     I      INDEXES DIGITS THAT ARE FLIPPED.
  6845. C     K      THE MIDPOINT OF THE FLIPPING ACTION.
  6846. C     PT     HOLDS THE RANGE OF THE FLIPPING ACTION.
  6847. C            (USUALLY THE HIGH ORDER NON-ZERO DIGIT)
  6848. C
  6849. C
  6850. C
  6851. C    SUBROUTINE FLIP (VEC,SIZE,PT)
  6852. C
  6853. C
  6854.     InTeGer*4 SIZE,PT
  6855.     InTeGer*4 K
  6856. C
  6857.     CHARACTER*1 VEC(SIZE), H1
  6858. C
  6859. C
  6860.     K=PT/2
  6861.     IF (K.EQ.0) GOTO 20
  6862.     DO 10 I=1,K
  6863.     H1=VEC(I)
  6864.     VEC(I)=VEC(PT+1-I)
  6865. 10    VEC(PT+1-I)=H1
  6866. 20    RETURN
  6867.     END
  6868. c -h- fname.fms    Fri Aug 22 13:09:16 1986    
  6869.     SUBROUTINE FNAME(LINE,LLAST,INDEXF)
  6870. C RETURN FUNCTION NAME IF ANY
  6871. C IMPLEMENT CODE RECOGNITION ALSO...
  6872. C CODES 230-254 ARE THE FUNCTION NAMES... REPLACE THE 3 BYTES BY 1
  6873. C CODE BYTE TO IMPLEMENT...
  6874. C
  6875.     CHARACTER*1 LINE(110)
  6876. c    EXTERNAL INDX
  6877.     INTEGER*4 FNAM(26)
  6878.     character*4 fnmx(26)
  6879.     equivalence(fnmx(1)(1:1),fnam(1))
  6880.     CHARACTER*1 FCHNM(4,26)
  6881.     EQUIVALENCE(FNAM(1),FCHNM(1,1))
  6882.     DATA FNMX/'MIN ','MAX ','AVG ','SUM ','STD ','IF  ',
  6883.      1  'AND ','IOR ','NOT ','CNT ','NPV ','LKP ',
  6884.      2  'LKN ','LKE ','XOR ','EQV ','MOD ','REM ','SGN ','IRR ',
  6885.      3  'RND ','PMT','PVL','AVE','CHS','ATM'/
  6886.     INDEXF=0
  6887.     N1=ICHAR(LINE(1))
  6888. C RECOGNIZE ENCODED VARIABLE NAMES.
  6889.     IF(N1.LT.230.OR.N1.GT.254)GOTO 3000
  6890.     INDEXF=N1-229
  6891.     RETURN
  6892. 3000    CONTINUE
  6893.     DO 1 N1=1,26
  6894.     DO 2 N2=1,3
  6895.     IF(LINE(N2).NE.FCHNM(N2,N1))GOTO 1
  6896. 2    CONTINUE
  6897. C IF WE FALL THROUGH, WE HAVE A VALID FCN NAME INDEX IN INDEXF
  6898.     INDEXF=N1
  6899.     GOTO 3
  6900. 1    CONTINUE
  6901. 3    CONTINUE
  6902.     RETURN
  6903.     END
  6904. c -h- frmedt.ftn    Fri Aug 22 13:09:29 1986    
  6905.     SUBROUTINE FRMEDT(INLIN,LEND)
  6906. C COPYRIGHT 1984 GLENN AND MARY EVERHART
  6907. C ALL RIGHTS RESERVED
  6908. C FORMULA EDIT TO FIND AND EDIT FORMULAS OF FORM
  6909. C    {VAR
  6910. C AND REPLACE THE VARIABLE SPEC BY FORMULA FOR THAT VARIABLE
  6911.     INCLUDE APARMS.INC
  6912.     CHARACTER*1 INLIN(110),WRK1(120),WRK2(128)
  6913.     CHARACTER*3 WRK13
  6914.     EQUIVALENCE(WRK13(1:1),WRK1(23))
  6915.     InTeGer*4 RRWACT,RCLACT
  6916. C    COMMON/RCLACT/RRWACT,RCLACT
  6917.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  6918.      1  IDOL7,IDOL8
  6919. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  6920. C     1  IDOL7,IDOL8
  6921.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  6922. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  6923.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  6924. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  6925. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  6926. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  6927.     InTeGer*4 KLVL
  6928. C    COMMON/KLVL/KLVL
  6929.     InTeGer*4 IOLVL,IGOLD
  6930. C    COMMON/IOLVL/IOLVL
  6931. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  6932. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  6933.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  6934.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  6935.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  6936.      3  k3dfg,kcdelt,krdelt,kpag
  6937. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  6938. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  6939. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  6940. CCC    InTeGer*4 LLCMD,LLDSP
  6941. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  6942. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  6943. C ADD LOGICAL NAMES IN THE FOLLOWING FASHION, TO BE MANIPULATED
  6944. C HERE ALONE:
  6945. C
  6946. C STORE LOGICAL NAMES, UP TO 16 CHARS, HERE IN AN ARRAY WITH
  6947. C DESIRED ID1,ID2 VALUES OF CELLS TO LOAD. WHERE A {NAME IS SEEN,
  6948. C REPLACE WITH DESIRED CELL ADDRESS.
  6949. C  TO DEFINE LOGICAL NAMES, LOOK FOR = AFTER A NAME. IF = IS SEEN
  6950. C  AFTER THE { CHARACTER, ASSUME IT'S A LINE OF FORM {SALES=AA0
  6951. C  (OR {SALES=00 TO DEASSIGN) AND STORE THE NAME. UP TO THE USER
  6952. C  TO PUT THE DESIRED FORMULA IN AS HE LIKES. MAY USE A TEST STMT
  6953. C  IF DESIRED.
  6954. CCC    CHARACTER*1 NAMARY(20,301)
  6955. C ALLOW AS MANY NAMES AS THERE ARE ROWS... ARBITRARY...
  6956.     InTeGer*4 ICREF,IRREF
  6957. C    COMMON/MIRROR/ICREF,IRREF
  6958.     InTeGer*4 MODPUB,LIMODE
  6959. C    COMMON/MODPUB/MODPUB,LIMODE
  6960.     InTeGer*4 KLKC,KLKR
  6961.     REAL*8 AACP,AACQ
  6962. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  6963.     InTeGer*4 NCEL,NXINI
  6964. C    COMMON/NCEL/NCEL,NXINI
  6965.     CHARACTER*1 NAMARY(20,MROWS)
  6966. C    COMMON/NMNMNM/NAMARY
  6967.     InTeGer*4 NULAST,LFVD
  6968. C    COMMON/NULXXX/NULAST,LFVD
  6969.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  6970.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  6971.     InTeGer*2 NAMNUM(10,MROWS)
  6972.     EQUIVALENCE(NAMARY(1,1),NAMNUM(1,1))
  6973. CCC    COMMON/NMNMNM/NAMARY
  6974. C NAMNUM(9,RCL) AND NAMNUM(10,RCL) ARE RRW AND RCL
  6975. C STORAGE. NAMARY(1-18,RCL) STORES NAME ASCII TEXT (POSSIBLY
  6976. C NULL TERMINATED). FIND CELLS VIA LINEAR SEARCH.
  6977.     SAVE NAMMAX
  6978.     InTeGer*4 NAMMAX
  6979. C NAMMAX IS MAX DIM OF NAMARY THAT'S FILLED IN.
  6980.     EXTERNAL INDX
  6981.     InTeGer*4 LEND
  6982.     DATA NAMMAX/0/
  6983.     LCNT=0
  6984. 1000    IF(LCNT.GT.20)RETURN
  6985.     KKK=ICHAR('{')
  6986.     I1=INDX(INLIN,KKK)
  6987.     IF(I1.LE.0.OR.I1.GT.70)RETURN
  6988. C ONLY ALLOW IF THERE IS A { CHAR THERE
  6989.     IF(INLIN(I1).NE.'{')RETURN
  6990.     KKK=ICHAR('=')
  6991.     I2=INDX(INLIN,KKK)
  6992.     IF(I2.LE.0.OR.I2.LT.I1.OR.I2.GT.70.OR.INLIN(I2)
  6993.      1  .NE.'=')GOTO 5400
  6994.     IF((I2-I1).LE.1)GOTO 5400
  6995. C HERE SEE AN = SIGN AFTER A {VAR STRING. ATTEMPT TO EVALUATE.
  6996. C GUARANTEED AT LEAST 1 CHARACTER OF NAME.
  6997.     I3=MIN0((I2-I1-1),16)
  6998. c check if * seen ( text would then be  {*= ) for printout
  6999.  
  7000. c of symbol table
  7001.     IF(INLIN(I1+1).NE.'*')GOTO 5600
  7002.     IF(NAMMAX.LE.0)GOTO 5600
  7003.     CALL UVT100(1,LLCMD,1)
  7004.     CALL UVT100(12,2,0)
  7005. C ERASE LINE
  7006.     CALL VWRT('Output File:',12)
  7007.     call vget(wrk1,80)
  7008. c    read(11,5602,end=5419,err=5419)(wrk1(II),II=1,80)
  7009. 5602    format(80a1)
  7010.     DO 5603 N=1,79
  7011.     NN=80-N
  7012.     IF(JCHAR(WRK1(NN)).GT.32)GOTO 5604
  7013.     WRK1(NN)=Char(0)
  7014. 5603    CONTINUE
  7015. 5604    CONTINUE
  7016.     close(8)
  7017.     CALL WASSIG(8,WRK1)
  7018. C OPEN OUTPUT FOR WRITE
  7019. C THEN DUMP SYMBOLS THERE
  7020. C SYMBOL TABLE DUMP CAN BE SAVED ANYWHERE AND REENTERED AS
  7021. C ASSIGNMENT STMTS.
  7022.     WRK1(1)='{'
  7023.     DO 5607 N=2,110
  7024. 5607    WRK1(N)=0
  7025.     WRK1(18)='='
  7026.     DO 5605 N=1,NAMMAX
  7027.     IF(NAMNUM(9,N)+NAMNUM(10,N).LE.0)GOTO 5605
  7028.     DO 5608 NN=1,16
  7029. 5608    WRK1(NN+1)=NAMARY(NN,N)
  7030.     CALL IN2AS(KK,WRK1(19))
  7031.     NAMNUM(9,N)=KK
  7032.     WRITE(WRK13(1:3),5606,ERR=5419)NAMNUM(10,N)-1
  7033. C    ENCODE(3,5606,WRK1(23))NAMNUM(10,N)-1
  7034. 5606    FORMAT(I3)
  7035.     K=3
  7036.     WRK2(1)='T'
  7037.     WRK2(2)='E'
  7038.     WRK2(3)=' '
  7039.     DO 5609 KK=1,106
  7040.     I4=JCHAR(WRK1(KK))
  7041.     IF(I4.LE.32)GOTO 5609
  7042.     K=K+1
  7043.     WRK2(K)=CHAR(I4)
  7044. 5609    CONTINUE
  7045. C WRITE OUT DEFINITIONS AS IF THEY WERE ASSIGMNENT STMTS.
  7046.     WRITE(8,5610)(WRK2(KK),KK=1,K)
  7047. 5610    FORMAT(110A1)
  7048. 5605    CONTINUE
  7049.     CLOSE(8)
  7050.     GOTO 5419
  7051. 5600    CONTINUE
  7052.     LO=I2+1
  7053.     IHI=LO+25
  7054.     CALL VARSCN(INLIN,LO,IHI,LSTCHR,ID1,ID2,IVLD)
  7055. C IF IVLD=0 ASSUME WE'RE UNDEFINING THE SYMBOL
  7056.     IF(IVLD.GT.0)GOTO 5402
  7057. C INVALID SYMBOL. UNDEFINE THE STRING.
  7058.     DO 5403 I4=1,NAMMAX
  7059.     DO 5404 I5=1,I3
  7060. C REQUIRE WHOLE STRING FOR SEARCH.
  7061.     IF(INLIN(I1+I5).NE.NAMARY(I5,I4))GOTO 5403
  7062. 5404    CONTINUE
  7063. C GOT IT IF WE FALL THRU
  7064.     NAMNUM(9,I4)=0
  7065.     NAMNUM(10,I4)=0
  7066. C ZERO THE ELEMENT DEFINITION AND FORGET IT...
  7067.     DO 5432 I5=1,16
  7068. 5432    NAMARY(I5,I4)=Char(0)
  7069. 5403    CONTINUE
  7070.     GOTO 5419
  7071. 5402    CONTINUE
  7072. C VALID ARRAY ELEMENT, DEFINE IT.
  7073.     IF(NAMMAX.LE.0)GOTO 5406
  7074.     DO 5405 I4=1,NAMMAX
  7075.     IF(NAMNUM(9,I4)+NAMNUM(10,I4).EQ.0)GOTO 5410
  7076. 5405    CONTINUE
  7077.     GOTO 5406
  7078. 5410    CONTINUE
  7079. C GOT IT IF WE FALL THRU
  7080.     NAMNUM(9,I4)=ID1
  7081.     NAMNUM(10,I4)=ID2
  7082. C ZERO THE ELEMENT DEFINITION AND FORGET IT...
  7083.     GOTO 5407
  7084. 5406    CONTINUE
  7085.     IF(NAMMAX.LT.0)NAMMAX=0
  7086.     NAMMAX=MIN0(NAMMAX+1,MROWS)
  7087.     NAMNUM(9,NAMMAX)=ID1
  7088.     NAMNUM(10,NAMMAX)=ID2
  7089. C NOW SAVE THE SYMBOL NAME
  7090.     I4=NAMMAX
  7091. 5407    CONTINUE
  7092.     DO 5409 I5=1,16
  7093. 5409    NAMARY(I5,I4)=0
  7094.     DO 5408 I5=1,I3
  7095.     NAMARY(I5,I4)=INLIN(I1+I5)
  7096. 5408    CONTINUE
  7097. C NO FURTHER PROCESSING IF WE DID ANY DEFINITION... JUST EXIT
  7098. 5419    CONTINUE
  7099.     INLIN(1)='%'
  7100. C IF A DEFINITION, JUST PUT SOMETHING INNOCUOUS INTO LINE FOR
  7101. C LATER PROCESSING.
  7102.     DO 5421 I5=2,110
  7103. 5421    INLIN(I5)=0
  7104.     RETURN
  7105. 5400    CONTINUE
  7106. C NOW THAT DEFINITIONS ARE TAKEN CARE OF (IF ANY)
  7107. C HANDLE SYMBOLIC SEARCHES
  7108.     if(nammax.le.0)goto 5505
  7109.     LSTCHR=I1+1
  7110.     DO 5501 I4=1,NAMMAX
  7111.     DO 5502 I5=1,16
  7112.     IF(JCHAR(NAMARY(I5,I4)).LE.47)GOTO 5502
  7113.     IF(JCHAR(INLIN(I1+I5)).LE.47)GOTO 5502
  7114.     LSTCHR=I1+I5+1
  7115.     IF(INLIN(I1+I5).NE.NAMARY(I5,I4))GOTO 5501
  7116. CC SKIP OUT IF WE HAVE A TERMINATING CHARACTER IN DEF
  7117. CC AND HAD AT LEAST 1 NONTERMINATING CHAR IN DEFINITION.
  7118. C    IF(JCHAR(NAMARY(1,I4)).GT.47.AND.
  7119. C     1     JCHAR(NAMARY(I5,I4)).LE.47) GOTO 5560
  7120. 5502    CONTINUE
  7121. 5560    CONTINUE
  7122. C IF WE FALL THRU WE HAVE A MATCH
  7123.     ID1=NAMNUM(9,I4)
  7124.     ID2=NAMNUM(10,I4)
  7125. C LAST CHECK: BE SURE WE AREN'T GIVING A DELETED SYMBOL.
  7126.     IF((ID1+ID2).GT.0)GOTO 5500
  7127. 5501    CONTINUE
  7128. 5505    continue
  7129.     LO=I1+1
  7130.     IHI=LO+25
  7131.     CALL VARSCN(INLIN,LO,IHI,LSTCHR,ID1,ID2,IVLD)
  7132.     IF(IVLD.LE.0)RETURN
  7133. 5500    CONTINUE
  7134.     DO 11 N1=1,120
  7135. 11    WRK1(N1)=0
  7136. C HERE HAVE A VALID CONSTRUCT SO REPLACE IT
  7137. C (ONLY ONE PER LINE THIS TIME ROUND)
  7138. C    IRX=(ID2-1)*60+ID1
  7139.     CALL REFLEC(ID2,ID1,IRX)
  7140. C COPY FIRST PART OF FORMULA TO WORK ARRAY
  7141.     LO=I1-1
  7142.     IHI=0
  7143.     IF(LO.LE.0)GOTO 10
  7144.     DO 1 N1=1,LO
  7145.     IHI=N1
  7146.     WRK1(IHI)=INLIN(N1)
  7147. 1    CONTINUE
  7148. 10    CONTINUE
  7149.     IHI=IHI+1
  7150.     CALL WRKFIL(IRX,WRK2,0)
  7151. C WRKFIL READS THE FORMULA INTO WRK2. NEXT FIND END OF TEXT
  7152.     DO 2 N1=1,110
  7153.     LO=111-N1
  7154.     IF(ICHAR(WRK2(LO)).GT.32)GOTO 3
  7155. 2    CONTINUE
  7156. 3    CONTINUE
  7157. C LO NOW IS LENGTH OF FORMULA
  7158.     DO 4 N1=1,LO
  7159.     WRK1(IHI)=WRK2(N1)
  7160.     IF(IHI.LT.110)IHI=IHI+1
  7161. 4    CONTINUE
  7162. C TACK ON ANY MORE TEXT
  7163. C RELY ON INLIN BEING 110 CHARS LONG
  7164.     DO 5 N1=LSTCHR,110
  7165.     WRK1(IHI)=INLIN(N1)
  7166.     IF(IHI.LT.110)IHI=IHI+1
  7167. 5    CONTINUE
  7168. C NOW COPY 110 CHARS BACK TO INLIN
  7169.     DO 6 N1=1,110
  7170. 6    INLIN(N1)=WRK1(N1)
  7171.     DO 7 N1=1,110
  7172.     LO=111-N1
  7173.     IF(ICHAR(INLIN(LO)).GT.32)GOTO 8
  7174. C    INLIN(LO)=CHAR(32)
  7175. 7    CONTINUE
  7176. 8    LEND=LO
  7177.     LCNT=LCNT+1
  7178.     GOTO 1000
  7179. C KEEP LOOKING & RECURSING BUT IMPOSE LIMIT
  7180. C    RETURN
  7181.     END
  7182. c -h- fvldgt.for    Fri Aug 22 13:10:38 1986    
  7183.         SUBROUTINE FVLDGT(ID1,ID2,IVAL)
  7184. C
  7185. C FVLDGT - RETURN FVLD BYTE GIVEN 2 DIMS OF ITS "LOCATION"
  7186.     INCLUDE APARMS.INC
  7187.         InTeGer*4 ID1,ID2
  7188.         CHARACTER*1 IVAL
  7189. C NEXT BITMAPS IMPLEMENT FVLD
  7190.     EXTERNAL INDX
  7191.         CHARACTER*1 LBITS(8)
  7192.         COMMON/BITS/LBITS
  7193.         CHARACTER*1 FV1(Imp1s),FV2(Imp1s),FV4(Imp1s)
  7194.     CHARACTER*1 FVXX(Imps3)
  7195.     EQUIVALENCE (FV1(1),FVXX(1)),(FV2(1),FVXX(Imp2s))
  7196.     EQUIVALENCE (FV4(1),FVXX(Imp3s))
  7197.         Common/FVLDM/FVXX
  7198. c        COMMON/FVLDM/FV1,FV2,FV4
  7199. C THE FOLLOWING BITMAP IS FOR TYPE ARRAY, AND INTEGER ARRAY IS FOR
  7200. C TYPES OF AC'S STORAGE:
  7201.         CHARACTER*1 ITYP(Imp1s)
  7202.         InTeGer*4 IATYP(27)
  7203.         COMMON/TYP/IATYP,ITYP
  7204.     InTeGer*4 ICREF,IRREF
  7205. C    COMMON/MIRROR/ICREF,IRREF
  7206.     InTeGer*4 MODPUB,LIMODE
  7207. C    COMMON/MODPUB/MODPUB,LIMODE
  7208.     InTeGer*4 KLKC,KLKR
  7209.     REAL*8 AACP,AACQ
  7210. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  7211.     InTeGer*4 NCEL,NXINI
  7212. C    COMMON/NCEL/NCEL,NXINI
  7213.     CHARACTER*1 NAMARY(20,Mrows)
  7214. C    COMMON/NMNMNM/NAMARY
  7215.     InTeGer*4 NULAST,LFVD
  7216. C    COMMON/NULXXX/NULAST,LFVD
  7217.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  7218.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  7219. CCC    InTeGer*4 ICREF,IRREF
  7220. CCC    COMMON/MIRROR/ICREF,IRREF
  7221. C
  7222. C NEXT ARE BUFFERS FOR HOLDING VALUES, AND MEMORY OCCUPANCY WORDS
  7223. C FOR EACH GIVING THE BLK # IN USE FOR THESE TABLES
  7224. C FORMAT BLOCK (ONE ONLY, 512 BYTES, BUT ORGANIZED AS 76 FORMAT
  7225. C AREAS WITH DATA.
  7226.     InTeGer*4 DLFG
  7227. C    COMMON/DLFG/DLFG
  7228.     InTeGer*4 KDRW,KDCL
  7229. C    COMMON/DOT/KDRW,KDCL
  7230.     InTeGer*4 DTRENA
  7231. C    COMMON/DTRCMN/DTRENA
  7232.     REAL*8 EP,PV,FV
  7233.     DIMENSION EP(20)
  7234.     INTEGER*4 KIRR
  7235. C    COMMON/ERNPER/EP,PV,FV,KIRR
  7236.     InTeGer*4 LASTOP
  7237. C    COMMON/ERROR/LASTOP
  7238.     CHARACTER*1 FMTDAT(9,76)
  7239. C    COMMON/FMTBFR/FMTDAT
  7240.     CHARACTER*1 EDNAM(16)
  7241. C    COMMON/EDNAM/EDNAM
  7242.     InTeGer*4 MFID(2),MFMOD(2)
  7243. C    COMMON/FRM/MFID,MFMOD
  7244.     InTeGer*4 JMVFG,JMVOLD
  7245. C    COMMON/FUBAR/JMVFG,JMVOLD
  7246.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  7247.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  7248. CCC        CHARACTER*1 FMTDAT(9,76)
  7249. CCC        COMMON/FMTBFR/FMTDAT
  7250.         CHARACTER*1 I1,I2,I4
  7251.     CHARACTER*1 IT1,IT2,IT4,IT8
  7252.     LOGICAL*4 LT1,LT2,LT4,LT8
  7253.     InTeGer*4 KT1,KT2,KT4,KT8
  7254.     CHARACTER*1 IT12(2),IT22(2),IT42(2),IT82(2)
  7255.        EQUIVALENCE(LT1,IT12(1)),(LT2,IT22(1)),(LT4,IT42(1)),
  7256.      1(LT8,IT82(1))
  7257.        EQUIVALENCE(KT1,IT12(1)),(KT2,IT22(1)),(KT4,IT42(1)),
  7258.      1 (KT8,IT82(1))
  7259. C INTEL 8088 USES 1ST CHAR IN HIGH BYTE SO FORCE IT1, IT2, IT4 ETC TO LOW
  7260. C ORDER BYTE WITH EQUIVALENCES
  7261.     EQUIVALENCE(IT12(2),IT1),(IT22(2),IT2),(IT42(2),IT4),
  7262.      1 (IT82(2),IT8)
  7263.     IF(ID2.GT.0)GOTO 2000
  7264. C TRICK ENTRY USING ID IN FIRST ARG, 0 IN 2ND ARG...
  7265. C TELL XVBLST/XVBLGT ABOUT FV4 STATE (SET BY CALL WITH -4 BYTE ON FVLDST)
  7266.     ID=ID1
  7267.         IBT=((ID-1)/8)+1
  7268.     KT1=ID-1
  7269.     KT2=7
  7270.     KT1=IMASK(KT1,KT2)
  7271. C    LT1=LT1.AND.LT2
  7272.     IBIT=KT1+1
  7273. C        IBIT=((ID-1).AND.7)+1
  7274. C        I1=FV1(IBT).AND.LBITS(IBIT)
  7275. C        I2=FV2(IBT).AND.LBITS(IBIT)
  7276. C        I4=FV4(IBT).AND.LBITS(IBIT)
  7277.     KT1=ICHAR(FV1(IBT))
  7278.     KT2=ICHAR(FV2(IBT))
  7279.     KT4=ICHAR(FV4(IBT))
  7280.     KT8=ICHAR(LBITS(IBIT))
  7281.     KT1=IMASK(KT1,KT8)
  7282. C    LT1=LT1.AND.LT8
  7283.     KT2=IMASK(KT2,KT8)
  7284. C    LT2=LT2.AND.LT8
  7285.     KT4=IMASK(KT4,KT8)
  7286. C    LT4=LT4.AND.LT8
  7287.     I1=CHAR(KT1)
  7288.     I2=CHAR(KT2)
  7289.     I4=CHAR(KT4)
  7290.     IVAL=0
  7291. C RETURN NONZERO IF ANY BITS ARE SET.
  7292.     IF((KT1+KT2+KT4).NE.0)IVAL=1
  7293. C    IF((I1+I2+I4).NE.0)IVAL=1
  7294.     RETURN
  7295. 2000    CONTINUE
  7296. C REFLECT ALL BACK TO PRIME STORAGE REGION
  7297. C        ID=(ID2-1)*60+ID1
  7298.     IF(ID2.EQ.1.AND.ID1.LE.MRC)GOTO 7806
  7299.     CALL REFLEC(ID2,ID1,ID)
  7300.     GOTO 7807
  7301. 7806    CONTINUE
  7302.     ID=ID1
  7303. 7807    IBT=((ID-1)/8)+1
  7304.     KT1=ID-1
  7305.     KT2=7
  7306.     KT1=IMASK(KT1,KT2)
  7307. C    LT1=LT1.AND.LT2
  7308.     IBIT=KT1+1
  7309. C        IBIT=((ID-1).AND.7)+1
  7310. C        I1=FV1(IBT).AND.LBITS(IBIT)
  7311. C        I2=FV2(IBT).AND.LBITS(IBIT)
  7312. C        I4=FV4(IBT).AND.LBITS(IBIT)
  7313.     KT1=ICHAR(FV1(IBT))
  7314.     KT2=ICHAR(FV2(IBT))
  7315.     KT4=ICHAR(FV4(IBT))
  7316.     KT8=ICHAR(LBITS(IBIT))
  7317. C    LT1=LT1.AND.LT8
  7318. C    LT2=LT2.AND.LT8
  7319. C    LT4=LT4.AND.LT8
  7320.     KT1=IMASK(KT1,KT8)
  7321.     KT2=IMASK(KT2,KT8)
  7322.     KT4=IMASK(KT4,KT8)
  7323. C    I1=CHAR(KT1)
  7324. C    I2=CHAR(KT2)
  7325. C    I4=CHAR(KT4)
  7326.         IVL=0
  7327.         IF(KT1.NE.0)IVL=1
  7328.         IF(KT2.NE.0)IVL=IVL+2
  7329.         IF(KT4.NE.0)IVL=-IVL
  7330.         IVAL=CHAR(IVL)
  7331. C READS OFF FVLD BYTE FROM 3 BITS, HIGH ONE IS SIGN. TREAT AS SIGN-
  7332. C MAGNITUDE NUMBER IN RANGE -3 TO +3,
  7333.         RETURN
  7334.         END
  7335. c -h- fvldst.for    Fri Aug 22 13:10:51 1986    
  7336.         SUBROUTINE FVLDST(ID1,ID2,IVAL)
  7337. C
  7338. C FVLDST - SET THE BYTE IN FVLD ARRAY
  7339. C NEXT BITMAPS IMPLEMENT FVLD
  7340.     Include Aparms.inc
  7341.         CHARACTER*1 FV1(Imp1s),FV2(Imp1s),FV4(Imp1s)
  7342.     CHARACTER*1 FVXX(IMps3)
  7343.     EQUIVALENCE (FV1(1),FVXX(1)),(FV2(1),FVXX(Imp2s))
  7344.     EQUIVALENCE (FV4(1),FVXX(Imp3s))
  7345.         Common/FVLDM/FVXX
  7346. c        COMMON/FVLDM/FV1,FV2,FV4
  7347.         CHARACTER*1 IVAL
  7348.         CHARACTER*1 LBITS(8)
  7349.     EXTERNAL INDX
  7350.         COMMON/BITS/LBITS
  7351. C THE FOLLOWING BITMAP IS FOR TYPE ARRAY, AND INTEGER ARRAY IS FOR
  7352. C TYPES OF AC'S STORAGE:
  7353.         CHARACTER*1 ITYP(Imp1s)
  7354.         InTeGer*4 IATYP(27)
  7355.         COMMON/TYP/IATYP,ITYP
  7356.     InTeGer*4 ICREF,IRREF
  7357. C    COMMON/MIRROR/ICREF,IRREF
  7358.     InTeGer*4 MODPUB,LIMODE
  7359. C    COMMON/MODPUB/MODPUB,LIMODE
  7360.     InTeGer*4 KLKC,KLKR
  7361.     REAL*8 AACP,AACQ
  7362. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  7363.     InTeGer*4 NCEL,NXINI
  7364. C    COMMON/NCEL/NCEL,NXINI
  7365.     CHARACTER*1 NAMARY(20,MRows)
  7366. C    COMMON/NMNMNM/NAMARY
  7367.     InTeGer*4 NULAST,LFVD
  7368. C    COMMON/NULXXX/NULAST,LFVD
  7369.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  7370.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  7371. CCC    InTeGer*4 ICREF,IRREF
  7372. CCC    COMMON/MIRROR/ICREF,IRREF
  7373. C
  7374. C NEXT ARE BUFFERS FOR HOLDING VALUES, AND MEMORY OCCUPANCY WORDS
  7375. C FOR EACH GIVING THE BLK # IN USE FOR THESE TABLES
  7376. C FORMAT BLOCK (ONE ONLY, 512 BYTES, BUT ORGANIZED AS 76 FORMAT
  7377. C AREAS WITH DATA.
  7378.     InTeGer*4 DLFG
  7379. C    COMMON/DLFG/DLFG
  7380.     InTeGer*4 KDRW,KDCL
  7381. C    COMMON/DOT/KDRW,KDCL
  7382.     InTeGer*4 DTRENA
  7383. C    COMMON/DTRCMN/DTRENA
  7384.     REAL*8 EP,PV,FV
  7385.     DIMENSION EP(20)
  7386.     INTEGER*4 KIRR
  7387. C    COMMON/ERNPER/EP,PV,FV,KIRR
  7388.     InTeGer*4 LASTOP
  7389. C    COMMON/ERROR/LASTOP
  7390.     CHARACTER*1 FMTDAT(9,76)
  7391. C    COMMON/FMTBFR/FMTDAT
  7392.     CHARACTER*1 EDNAM(16)
  7393. C    COMMON/EDNAM/EDNAM
  7394.     InTeGer*4 MFID(2),MFMOD(2)
  7395. C    COMMON/FRM/MFID,MFMOD
  7396.     InTeGer*4 JMVFG,JMVOLD
  7397. C    COMMON/FUBAR/JMVFG,JMVOLD
  7398.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  7399.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  7400. CCC        CHARACTER*1 FMTDAT(9,76)
  7401.     InTeGer*4 IVV,I1,I2,I3,ITA
  7402.     LOGICAL*4 L2,L1,LVV,LTA
  7403.     EQUIVALENCE(L2,I2),(L1,I1),(LVV,IVV)
  7404.     EQUIVALENCE(LTA,ITA)
  7405. CCC        COMMON/FMTBFR/FMTDAT
  7406.     CHARACTER*1 IT1,IT2,IT4,IT8
  7407.     LOGICAL*4 LT1,LT2,LT4,LT8
  7408.     InTeGer*4 KT1,KT2,KT4,KT8,KW1,KW2
  7409.     CHARACTER*1 IT12(2),IT22(2),IT42(2),IT82(2)
  7410.     EQUIVALENCE(LT1,IT12(1)),(LT2,IT22(1)),(LT4,IT42(1)),
  7411.      1  (LT8,IT82(1))
  7412.     EQUIVALENCE(KT1,IT12(1)),(KT2,IT22(1)),(KT4,IT42(1)),
  7413.      1  (KT8,IT82(1))
  7414. C INTEL 8088 USES 1ST CHAR IN HIGH BYTE SO FORCE IT1, IT2, IT4 ETC TO LOW
  7415. C ORDER BYTE WITH EQUIVALENCES
  7416. C    EQUIVALENCE(IT12(2),IT1),(IT22(2),IT2),(IT42(2),IT4),
  7417. C     1  (IT82(2),IT8)
  7418. C        CHARACTER*1 I4
  7419.     IF(ID2.EQ.1.AND.ID1.LE.MRC)GOTO 7806
  7420. C ALLOW DELIBERATE CALL WITH EFFECTIVELY ONE ARG.
  7421. 7807    CALL REFLEC(ID2,ID1,ID)
  7422.     GOTO 7808
  7423. 7806    CONTINUE
  7424. C        ID=(ID2-1)*60+ID1
  7425.     ID=ID1
  7426. 7808    IBT=((ID-1)/8)+1
  7427.     KT1=ID-1
  7428.     KT2=7
  7429.     KT1=IMASK(KT1,KT2)
  7430. C    LT1=LT1.AND.LT2
  7431.     IBIT=KT1+1
  7432. C        IBIT=((ID-1).AND.7)+1
  7433. C ZERO ALL 3 FVLD BITS FIRST
  7434. C        FV1(IBT)=FV1(IBT).AND..NOT.LBITS(IBIT)
  7435. C        FV2(IBT)=FV2(IBT).AND..NOT.LBITS(IBIT)
  7436. C        FV4(IBT)=FV4(IBT).AND..NOT.LBITS(IBIT)
  7437.     KT1=ICHAR(FV1(IBT))
  7438.     KT2=ICHAR(FV2(IBT))
  7439.     KT4=ICHAR(FV4(IBT))
  7440.     KT8=ICHAR(LBITS(IBIT))
  7441.     ITA=-KT8-1
  7442. C ITA IS NOW THE COMPLEMENT OF KT8
  7443. C THUS, THE SELECTED BIT IS OFF IN IT, ALL OTHERS ON.
  7444. C    LT1=LT1.AND.LTA
  7445. C    LT2=LT2.AND.LTA
  7446. C    LT4=LT4.AND.LTA
  7447.     KT1=IMASK(KT1,ITA)
  7448.     KT2=IMASK(KT2,ITA)
  7449.     KT4=IMASK(KT4,ITA)
  7450. C FILL IN ALL 3 BITMAPS WITH THEIR PREVIOUS CONTENTS EXCEPT THE
  7451. C CHOSEN BITS.
  7452.     FV1(IBT)=CHAR(KT1)
  7453.     FV2(IBT)=CHAR(KT2)
  7454.     FV4(IBT)=CHAR(KT4)
  7455.     IVVV=JCHAR(IVAL)
  7456.         IVV=IABS(IVVV)
  7457.         I3=0
  7458.         IF(IVVV.LT.0)I3=1
  7459. C    I1=1
  7460. C    I2=2
  7461.     KW2=2
  7462.     KW1=1
  7463.     I2=IMASK(IVV,KW2)
  7464.     I1=IMASK(IVV,KW1)
  7465. C        L2=LVV.AND.L2
  7466. C        L1=LVV.AND.L1
  7467. C NOTE WE ASSUME HEAVILY THAT LOGICAL OPERATIONS WORK BY BINARY
  7468. C ANDS AND ORS IN DATA.
  7469. C ** NOTE WE DON'T NEED TO RELOAD THE KT1 THRU KT4 INTEGERS... ALL ALREADY
  7470. C ARE LOADED... DITTO KT8
  7471. C    KT1=ICHAR(FV1(IBT))
  7472. C    KT2=ICHAR(FV2(IBT))
  7473. C    KT4=ICHAR(FV4(IBT))
  7474. C    KT8=ICHAR(LBITS(IBIT))
  7475.     LT1=LT1.OR.LT8
  7476.     LT2=LT2.OR.LT8
  7477.     LT4=LT4.OR.LT8
  7478. C        IF(I1.NE.0)FV1(IBT)=FV1(IBT).OR.LBITS(IBIT)
  7479. C        IF(I2.NE.0)FV2(IBT)=FV2(IBT).OR.LBITS(IBIT)
  7480. C        IF(I3.NE.0)FV4(IBT)=FV4(IBT).OR.LBITS(IBIT)
  7481.         IF(I1.NE.0)FV1(IBT)=CHAR(KT1)
  7482.         IF(I2.NE.0)FV2(IBT)=CHAR(KT2)
  7483.         IF(I3.NE.0)FV4(IBT)=CHAR(KT4)
  7484.         RETURN
  7485.         END
  7486. c -h- fvpeek.fms    Fri Aug 22 13:11:27 1986    
  7487. C DUMMY FVPEEK
  7488.     SUBROUTINE FVPEEK(ID1,ID2,IGO)
  7489.     InTeGer*4 ID1,ID2,IGO
  7490.     IGO=ID1
  7491.     RETURN
  7492.     END
  7493. c -h- getfnl.for    Fri Aug 22 13:12:09 1986    
  7494.     SUBROUTINE GETFNL(LINE,LSKP,LLEN)
  7495. C PARSE OUT FILENAME AND GET LSKP, LLEN NUMBERS
  7496.     EXTERNAL INDX
  7497.     CHARACTER*1 LINE(80)
  7498.     InTeGer*4 LSKP,LLEN,LO,HI
  7499.     LSKP=0
  7500.     LLEN=32000
  7501. C SET INITIAL NUMBERS TO READ WHOLE FILE
  7502.     KKK=ICHAR(',')
  7503.     N=INDX(LINE,KKK)
  7504.     IF(N.LE.0.OR.N.GT.78)RETURN
  7505. C IF CANNOT FIND COMMA, JUST SKIP OUT & TRY TO CATCH ERRORS ON OPEN.
  7506.     LINE(N)=0
  7507. C NULL TERMINATE FILENAME
  7508.     LO=N+1
  7509.     HI=LO+20
  7510.     CALL GN(LO,HI,LSKP,LINE)
  7511.     LO=N+1
  7512.     KKK=ICHAR(',')
  7513.     N=INDX(LINE(LO),KKK)
  7514.     IF(N.LE.0.OR.N.GT.30)RETURN
  7515.     LO=LO+N
  7516.     HI=LO+20
  7517.     CALL GN(LO,HI,LLEN,LINE)
  7518. C SHOULD HAVE NUMBERS NOW
  7519.     RETURN
  7520.     END
  7521. c -h- getlog.for    Fri Aug 22 13:12:16 1986    
  7522.     SUBROUTINE GETLOG(LINE,LMX,LOGTYP,LASST)
  7523.     CHARACTER*1 LINE(110)
  7524.     EXTERNAL INDX
  7525.     CHARACTER*1 LFN(4,6)
  7526.     CHARACTER*4 XLF(6)
  7527.     INTEGER*4 LF(6)
  7528.     EQUIVALENCE(XLF(1)(1:1),LF(1),LFN(1,1))
  7529. C    EQUIVALENCE(LF(1),LFN(1,1))
  7530.     DATA XLF/'.GT.','.LT.','.EQ.','.NE.','.GE.','.LE.'/
  7531. C LOGTYP RELATIONSHIP TO RELATIONSHIPS OF 2 VARIABLES
  7532. C IS DEFINED IN ABOVE DATA STMT.
  7533. C IF LINE CONTAINS STRING IN NAME, RETURN TYPE AND END LOC.
  7534.     LMX4=LMX-3
  7535.     DO 100 LL=1,6
  7536.     LOGTYP=LL
  7537.     DO 1 N1=1,LMX4
  7538.     IF(LINE(N1  ).NE.LFN(1,LL))GOTO 2
  7539.     IF(LINE(N1+1).NE.LFN(2,LL))GOTO 2
  7540.     IF(LINE(N1+2).NE.LFN(3,LL))GOTO 2
  7541.     IF(LINE(N1+3).NE.LFN(4,LL))GOTO 2
  7542. C HERE HAVE A MATCH
  7543.     LASST=N1
  7544. C RETURN LOC OF NEXT CHAR AFTER RELATION.
  7545.     GOTO 200
  7546. 2    CONTINUE
  7547. 1    CONTINUE
  7548. 100    CONTINUE
  7549.     LOGTYP=0
  7550. 200    CONTINUE
  7551.     RETURN
  7552.     END
  7553. c -h- getnnb.for    Fri Aug 22 13:13:44 1986    
  7554.     SUBROUTINE GETNNB(IPT,RETCD)
  7555. C COPYRIGHT (C) 1983 GLENN EVERHART
  7556. C ALL RIGHTS RESERVED
  7557. C 60=MAX REAL ROWS
  7558. C 301=MAX REAL COLS
  7559. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  7560. C VBLS AND TYPE DIMENSIONED 60,301
  7561. C **************************************************
  7562.  
  7563. C *                                                *
  7564. C *         SUBROUTINE GETNNB(IPT,RETCD)           *
  7565. C *                                                *
  7566. C **************************************************
  7567. C
  7568. C
  7569. C  GET NEXT NON-BLANK ELEMENT FROM LINE STARTING AT NONBLK+1
  7570. C
  7571. C  RETCD =  1   O.K.
  7572. C        2   NO NON-BLANK FOUND
  7573. C
  7574. C  IPT POINTS TO POSITION IN LINE WHERE NEXT NON-BLANK IS FOUND.
  7575. C  IT IS UP TO CALLING PROGRAM TO RESET NONBLK FOR NEXT SCAN.
  7576. C
  7577. C
  7578. C
  7579. C GETNNB IS CALLED BY
  7580. C
  7581. C AT
  7582. C BASCNG
  7583. C CMND
  7584. C NEXTEL
  7585. C STRCMP
  7586. C
  7587. C
  7588. C   VARIABLE    USE
  7589. C
  7590. C    BLANK      ' '
  7591. C    IPT        RETURNS POSITION OF NEXT NON-BLANK.
  7592. C    K          HOLDS TEMPORARY VALUES.
  7593. C    LEND       LAST NON-BLANK IN LINE(80).
  7594. C    NONBLK     HOLDS CHARACTER TO LEFT OF THE START OF THE SCAN.
  7595. C    RETCD      HOLDS THE RETURN CODE. 1=O.K.  2=THE REST IS BLANKS.
  7596. C
  7597. C
  7598. C    SUBROUTINE GETNNB(IPT,RETCD)
  7599. C
  7600. C
  7601.     InTeGer*4 IPT
  7602.     InTeGer*4 LEVEL,NONBLK,LEND
  7603.     InTeGer*4 VIEWSW,BASED,BASE,RETCD
  7604.     InTeGer*4 K
  7605. C
  7606.     CHARACTER*1 LINE(80),ALPHA(27),COMMA,BLANK,RPAR,LPAR,EQ
  7607. C
  7608.     COMMON LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  7609.     COMMON /CONS/ ALPHA,COMMA,BLANK,RPAR,LPAR,EQ
  7610. C
  7611.     RETCD=1
  7612.     IF (NONBLK.GE.LEND) GOTO 999
  7613. C
  7614. C AT LEAST 1 NON-BLANK EXISTS.
  7615.     K=NONBLK+1
  7616.     DO 10 IPT=K,LEND
  7617.     IF (LINE(IPT).NE.BLANK) GOTO 1000
  7618. 10    CONTINUE
  7619. C
  7620. C
  7621. C ACTUALLY, SHOULD NEVER FALL THROUGH IF 'LEND' IS SET CORRECTLY.
  7622. C
  7623. C
  7624. C THE REST ARE BLANKS
  7625. 999    RETCD=2
  7626. 1000    RETURN
  7627.     END
  7628. c -h- getttl.for    Fri Aug 22 13:14:41 1986    
  7629.     SUBROUTINE GETTTL(LINE)
  7630.     Include AParms.inc
  7631.     CHARACTER*1 LINE(132)
  7632.     CHARACTER*3 FNAME
  7633.     CHARACTER*1 FN(3)
  7634.     EQUIVALENCE (FN(1),FNAME(1:1))
  7635.     InTeGer*4 IBBX
  7636.     InTeGer*4 ICREF,IRREF
  7637. C    COMMON/MIRROR/ICREF,IRREF
  7638.     InTeGer*4 MODPUB,LIMODE
  7639. C    COMMON/MODPUB/MODPUB,LIMODE
  7640.     InTeGer*4 KLKC,KLKR
  7641.     REAL*8 AACP,AACQ
  7642. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  7643.     InTeGer*4 NCEL,NXINI
  7644. C    COMMON/NCEL/NCEL,NXINI
  7645.     CHARACTER*1 NAMARY(20,MRows)
  7646. C    COMMON/NMNMNM/NAMARY
  7647.     InTeGer*4 NULAST,LFVD
  7648. C    COMMON/NULXXX/NULAST,LFVD
  7649.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  7650.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  7651. CCC    COMMON/MODPUB/MODPUB,LIMODE
  7652. C MODPUB = MODE USED IN CMD MODE GTMODE ROUTINE
  7653.     InTeGer*4 RRWACT,RCLACT
  7654. C    COMMON/RCLACT/RRWACT,RCLACT
  7655.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  7656.      1  IDOL7,IDOL8
  7657. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  7658. C     1  IDOL7,IDOL8
  7659.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  7660. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  7661.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  7662. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  7663. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  7664. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  7665.     InTeGer*4 KLVL
  7666. C    COMMON/KLVL/KLVL
  7667.     InTeGer*4 IOLVL,IGOLD
  7668. C    COMMON/IOLVL/IOLVL
  7669. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  7670. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  7671.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  7672.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  7673.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  7674.      3  k3dfg,kcdelt,krdelt,kpag
  7675. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  7676. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  7677. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  7678. CCC    InTeGer*4 LLCMD,LLDSP
  7679. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  7680. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  7681. C LIMODE IS WHAT GETS SET UP IN /# CMND
  7682.     IBBX=0
  7683. C
  7684. C
  7685. C
  7686. C
  7687. C CODE FOR FORTRAN READ...
  7688. C  **** HERE IS THE SECTION OF CODE YOU NEED FOR NON-VMS-SPECIFIC VERSION
  7689. C NOTE READS UNIT 0 TO GET CONSOLE.
  7690. C CHECK THAT WE'RE READING CONSOLE. IF LUN 5 IS OFF CONSOLE, THEN
  7691. C READ USING DIRECT DOS CALLS.
  7692. C  IF (STILL) IN AN INITIALIZER FILE, READ USING REGULAR FORTRAN READS
  7693. C AND ACT NORMALLY.
  7694. C  DISCOVER CONSOLE BECAUSE FILENAME IS 'CON:' OR 'CON'.
  7695. CC    INQUIRE(UNIT=5,NAME=FNAME)
  7696. CC    IF (FN(1).NE.'C'.OR.FN(2).NE.'O'.OR.FN(3).NE.'N')
  7697. CC     1 GOTO 5000
  7698. C CALL ASSEMBLER ROUTINE TO GET CHARACTERS.
  7699.     DO 5001 N=1,132
  7700. 5001    LINE(N)=CHAR(0)
  7701. C FIX IT UP SO A NULL LINE LOOKS HARMLESS...
  7702.     LINE(1)=' '
  7703. C NULL THE LINE FIRST IN FORTRAN; MAKES IT EASIER TO DO ASSEMBLER STUFF.
  7704.     CALL TTYIN(MODPUB,LINE)
  7705.     IF(LINE(1).NE.'/')GOTO 5540
  7706. C DISPLAY HELP MSG AT BOTTOM
  7707.     IF(MODPUB.EQ.0)GOTO 5540
  7708. C ONLY DISPLAY IF IN "AUTOENTER" MODE
  7709. c    CALL UVT100(1,LLDSP,1)
  7710. c    CALL SWRT('Add,Cpy,Dsp,Fil,Get,Kalc,Loc,Mov,Put,Recal,Set',46)
  7711. c    CALL SWRT(',Tst,View,Wrt,Xit,Zap,/,Help',28)
  7712. c    CALL UVT100(1,LLCMD,11)
  7713. C CALL TTYIN NEXT WITH 0 SO / ISN'T TERMINATOR.
  7714. c    N=0
  7715. C    CALL TTYIN(N,LINE(2))
  7716. 5540    CONTINUE
  7717.     IF(ICHAR(LINE(1)).EQ.26)
  7718.      1  GOTO 2000
  7719. C Add,Copy,Dsp,Fil,Get,Kalc,Loc,Mov,Put,Recal,Set,Test,View,Wrt,Xit,Zap,Help,/
  7720. C READ IN AFTER CLOSE AND RE-OPEN IF WE GET EOF ON INPUT SIGNALLED
  7721. C BY CONTROL Z.
  7722. C ASSUME WE'LL USE DOS FUNCTION 1 FOR READIN AND ECHO
  7723. C AND THEN END THE READIN AFTER FIRST CONTROL SEQUENCE.
  7724. C    GOTO 6000
  7725. C5000    CONTINUE
  7726. C    READ(5,1000,END=2000,ERR=2000)LINE
  7727. 1000    FORMAT(132A1)
  7728. 6000    CONTINUE
  7729. CC    IF(ICHAR(LINE(1)).NE.0)RETURN
  7730. CCC IF WE GET 0 MAYBE IT'S AN EXTENDED CODE. TRY RETURNING A HASHED
  7731. CCC VALUE HERE. USE __{CELL WHERE CELL IS A FOLLOWED BY (B+CODE) WHERE
  7732. CC CODE IS THE VALUE RETURNED...
  7733. CC    LINE(5)=CHAR(ICHAR(LINE(2))+66-59)
  7734. CC EXTENDED CODES WE CARE ABOUT START AT 59.
  7735. CC MAP INTO EXTENDED AC'S STARTING AT AB SINCE AA IS THE SAME AS % ACCUMULATOR
  7736. CC WHICH CAN'T BE REASSIGNED THIS WAY.
  7737. C    LINE(5)=CHAR(ICHAR(LINE(2))+7)
  7738. C    LINE(1)='_'
  7739. C    LINE(2)='_'
  7740. C    LINE(3)='{'
  7741. C    LINE(4)='A'
  7742. C
  7743. C WE SHOULD "KNOW" COORDS HERE DESIRED...
  7744. C THEY RUN FROM B TO Z...IMPLYING ID1=28 THRU 53
  7745. CC    II=ICHAR(LINE(5))-66+28
  7746. C    II=ICHAR(LINE(5))-38
  7747. C SCREEN OUT EXTRA JUNK THAT WOULD COME FROM HIGH FUNCT CODES...
  7748. C (DON'T BOTHER MAPPING A<Z+1> TO BA AND SO ON... ONLY 6
  7749. C KEYS IN USABLE RANGE ANYHOW...
  7750. C    IF(II.GT.52)GOTO 1200
  7751. C    III=1
  7752. C    CALL FVLDGT(II,III,IBBX)
  7753. C    IF(IBBX.EQ.0)GOTO 1200
  7754. C SKIP OVER CELLS THAT ARE EMPTY.
  7755. C
  7756. C NULL OUT REMAINDER OF THE LINE TO AVOID CONFUSION HERE.
  7757. C NOTE WE ONLY DO THIS WHERE WE SAW AN INITIAL NULL INDICATING AN
  7758. C EXTENDED FUNCTION INPUT.
  7759. C    IBBX=6
  7760. C    GOTO 1201
  7761. C1200    IBBX=1
  7762. C1201    CONTINUE
  7763. C    DO 1100 N=IBBX,132
  7764. C1100    LINE(N)=CHAR(0)
  7765.     RETURN
  7766. 2000    CONTINUE
  7767. c    CLOSE(18)
  7768.     IOLVL=11
  7769. c    OPEN(18,FILE='CON:20/40/150/150/Analy Command Input')
  7770.     CLOSE(3)
  7771. CC RETRY A READ AFTER EOF...
  7772. Cc try a write to 5 to see if that'll reset the file
  7773. c    Rewind 11
  7774. c    write(11,4002)
  7775. 4002    format(' *eof*')
  7776. c    Rewind 11
  7777.     Call vget(line,80)
  7778. c    READ(11,1000,END=4000,ERR=4000)LINE
  7779. c    rewind 11
  7780.     RETURN
  7781. 4000    CONTINUE
  7782. CC IF WE KEEP GETTING ERRORS, JUST QUIT.
  7783. CC AT LEAST STAY AROUND. USER CAN DO @\DEV\CON
  7784. CC TO PARTLY RECOVER...
  7785. C    STOP
  7786. C TRY TO RESET TTY EOF
  7787. C *********
  7788.     RETURN
  7789.     END
  7790. c -h- gmadd.for    Fri Aug 22 13:16:31 1986    
  7791.     SUBROUTINE GMADD(IA1,IA2,IB1,IB2,IR1,IR2,N,M)
  7792. C MODIFIED FOR PCCPC
  7793.     Include AParms.Inc
  7794. C      SUBROUTINE GMADD(A,B,R,N,M)
  7795.        REAL*8 A,B,R
  7796.        DIMENSION A(1),B(1),R(1)
  7797. C      NM=N*M
  7798.     IAB=(IA2-1)*MCols+IA1-1
  7799.     IBB=(IB2-1)*MCols+IB1-1
  7800.     IRB=(IR2-1)*MCols+IR1-1
  7801.       DO 10 I=1,N
  7802.       DO 10 J=1,M
  7803.     IJ=(I-1)*MCols+J
  7804.     CALL XVBLGT(IJ+IAB,0,A)
  7805.     CALL XVBLGT(IJ+IBB,0,B)
  7806.     R(1)=A(1)+B(1)
  7807.     CALL XVBLST(IJ+IRB,0,R)
  7808. 10    CONTINUE
  7809. C   10 R(IJ)=A(IJ)+B(IJ)
  7810.       RETURN
  7811.       END
  7812. c -h- gmprd.for    Fri Aug 22 13:16:31 1986    
  7813.     SUBROUTINE GMPRD(IA1,IA2,IB1,IB2,IR1,IR2,N,M,L)
  7814.     Include AParms.Inc
  7815. C      SUBROUTINE GMPRD(A,B,R,N,M,L)
  7816.     REAL*8 A,B,R
  7817.         DIMENSION A(1),B(1),R(1)
  7818. C SPECIAL MATRIX MULTIPLY WITHIN SPREADSHEET MATRIX
  7819.     IAB=(IA2-1)*MCols+IA1-1
  7820.     IBB=(IB2-1)*MCols+IB1-1
  7821.     IRB=(IR2-1)*MCols+IR1-1
  7822.     DO 10 K=1,L
  7823.     DO 10 J=1,M
  7824.     NL=(J-1)*MCols+K
  7825.     R(1)=0.
  7826.     CALL XVBLST(IRB+NL,0,R)
  7827.     DO 10 I=1,N
  7828.     NM=(J-1)*MCols+I
  7829.     ML=(I-1)*MCols+K
  7830.     CALL XVBLGT(IAB+NM,0,A)
  7831.     CALL XVBLGT(IBB+ML,0,B)
  7832.     A(1)=A(1)*B(1)
  7833.     CALL XVBLGT(IRB+NL,0,R)
  7834.     R(1)=R(1)+A(1)
  7835. 10    CALL XVBLST(IRB+NL,0,R)
  7836. C    R(NL)=R(NL)+A(NM)*B(ML)
  7837. C10    CONTINUE
  7838.       RETURN
  7839.       END
  7840. c -h- gmsub.for    Fri Aug 22 13:16:31 1986    
  7841.     SUBROUTINE GMSUB(IA1,IA2,IB1,IB2,IR1,IR2,N,M)
  7842. C      SUBROUTINE GMSUB(A,B,R,N,M)
  7843.     Include AParms.Inc
  7844.     REAL*8 A,B,R
  7845.     IAB=(IA2-1)*MCols+IA1-1
  7846.     IBB=(IB2-1)*MCols+IB1-1
  7847.     IRB=(IR2-1)*MCols+IR1-1
  7848. C      NM=N*M
  7849.       DO 10 I=1,N
  7850.       DO 10 J=1,M
  7851.       IJ=(I-1)*MCols+J
  7852.     CALL XVBLGT(IAB+IJ,0,A)
  7853.     CALL XVBLGT(IBB+IJ,0,B)
  7854.     A=A-B
  7855.     CALL XVBLST(IRB+IJ,0,A)
  7856. 10    CONTINUE
  7857. C   10 R(IJ)=A(IJ)-B(IJ)
  7858.       RETURN
  7859.       END
  7860. c -h- gmtx.for    Fri Aug 22 13:16:31 1986    
  7861.     SUBROUTINE GMTX(LINE,IBGN,LSTCHR,ID1A,ID2A,ID1B,
  7862.      1  ID2B,RETCD)
  7863.  
  7864.     CHARACTER*1 LINE(80)
  7865. C REQ END MTX NAME IN 20 CHARS.
  7866. C SHOULD BE OK
  7867.     LEND=IBGN+20
  7868. C GET LOC OF MATRIX A (MUST BE SQUARE)
  7869.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1A,ID2A,IVALID)
  7870.     IF(IVALID.EQ.0)GOTO 300
  7871.     IF(LINE(LSTCHR).NE.':')GOTO 300
  7872.     IBGN=LSTCHR+1
  7873.     LEND=IBGN+20
  7874.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1B,ID2B,IVALID)
  7875.     IF(IVALID.EQ.0)GOTO 300
  7876. 1000    RETURN
  7877. 300    RETCD=3
  7878.     RETURN
  7879.     END
  7880. c -h- gn.for    Fri Aug 22 13:16:49 1986    
  7881.     SUBROUTINE GN(LAST,LEND,NUM,LINE)
  7882.     IMPLICIT InTeGer*4(A-Z)
  7883. C    PARAMETER 1=1,14=14
  7884.     DIMENSION LINE(110)
  7885.     CHARACTER*1 LINE
  7886.     EXTERNAL INDX
  7887.     CHARACTER*1 NCH
  7888.     InTeGer*4 CH,SFG
  7889.     NUM=0
  7890.     JSSF=0
  7891.     ISSF=0
  7892.     CH=0
  7893.     SFG=1
  7894.     NCH=0
  7895.     DO 1 N=LAST,LEND
  7896.     M=N
  7897.     NCH=LINE(N)
  7898.     CH=ICHAR(NCH)
  7899.     IF(CH.EQ.0)GOTO 2
  7900.     IF(CH.EQ.45)SFG=-1
  7901. C SFG=SIGN FLAG
  7902. C 43 IS ASCII FOR +; 45 IS ASCII FOR - SIGN.
  7903. C IGNORE + SIGNS
  7904.     IF(CH.GT.32)ISSF=ISSF+1
  7905.     IF(ISSF.EQ.0.AND.CH.EQ.32)GOTO 1
  7906. C IGNORE SPACES TOO, PROVIDED THEY ARE LEADING SPACES.
  7907. C (OTHERS MAY BE DELIMITERS.)
  7908.     IF(CH.EQ.43.OR.CH.EQ.45)JSSF=JSSF+1
  7909.     IF(JSSF.GT.1.AND.(CH.EQ.43.OR.CH.EQ.45))GOTO 2
  7910. C IF WE HAVEN'T SEEN A +/- PROCESS IT HERE.
  7911.     IF(CH.EQ.43)GOTO 1
  7912.     IF(CH.EQ.45)GOTO 1
  7913.     IF(CH.LT.48.OR.CH.GT.57)GOTO 2
  7914. C TERMINATE ON ANY NON NUMERIC. SHOULD ALLOW TERMINATE ON SECOND #.
  7915.     IF(NUM.LT.3100)NUM=10*NUM+(CH-48)
  7916. 1    CONTINUE
  7917. C NEXT LINE WAS MAX0...
  7918. 2    LAST=MIN0(M,LEND)
  7919.     NUM=NUM*SFG
  7920. C ACCOUNTED FOR SIGN; NOW RETURN
  7921.     RETURN
  7922.     END
  7923. c -h- gtmung.for    Fri Aug 22 13:17:12 1986    
  7924.     SUBROUTINE GTMUNG(LINE)
  7925.     Include AParms.inc
  7926.     CHARACTER*1 LINE(132)
  7927.     InTeGer*4 IMODE
  7928.     CHARACTER*1 C2
  7929.     InTeGer*4 ICREF,IRREF
  7930. C    COMMON/MIRROR/ICREF,IRREF
  7931.     InTeGer*4 MODPUB,LIMODE
  7932. C    COMMON/MODPUB/MODPUB,LIMODE
  7933.     InTeGer*4 KLKC,KLKR
  7934.     REAL*8 AACP,AACQ
  7935. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  7936.     InTeGer*4 NCEL,NXINI
  7937. C    COMMON/NCEL/NCEL,NXINI
  7938.     CHARACTER*1 NAMARY(20,MRows)
  7939. C    COMMON/NMNMNM/NAMARY
  7940.     InTeGer*4 NULAST,LFVD
  7941. C    COMMON/NULXXX/NULAST,LFVD
  7942.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  7943.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  7944. CCC    COMMON/MODPUB/MODPUB,LIMODE
  7945.     DATA IMODE/0/
  7946. C HANDLE EXTRA MODE PARSING...DEFAULT,TO AVOID ENTER CMD IF NOT NEEDED.
  7947.     I=ICHAR(LINE(1))
  7948.     IF(I.LT.34.OR.I.GT.122)GOTO 6000
  7949.     IF(I.EQ.42)GOTO 6000
  7950. C ASSUME OTHER REASONABLE CHARS ARE CMDS
  7951.     IF(I.GT.34.AND.I.LT.40)GOTO 6000
  7952.     IF(I.EQ.95)GOTO 6000
  7953.     IF(I.GE.58.AND.I.LE.64)GOTO 6000
  7954.     IF(LINE(1).NE.'/')GOTO 100
  7955.     IF(LINE(2).NE.'/')GOTO 110
  7956. C SETUP OLD MODE WITH //
  7957.     IMODE=0
  7958.     GOTO 900
  7959. 110    CONTINUE
  7960.     IF(LINE(2).NE.';')GOTO 120
  7961. C SETUP NEW MODE WITH /;
  7962.     IMODE=1
  7963.     GOTO 900
  7964. 120    CONTINUE
  7965.     IF(LINE(2).NE.'#')GOTO 124
  7966. C SWAP OLD, CURRENT MODES
  7967. C USE IN CMD FILES SO /# SWAPS MODES, THEN // SETS OLD MODE,
  7968. C THEN /# SWAPS BACK
  7969. C (THAT WAY, USER'S MODE DOESN'T CHANGE.)
  7970.     I=LIMODE
  7971.     LIMODE=IMODE
  7972.     IMODE=I
  7973.     GOTO 900
  7974. 124    CONTINUE
  7975.     IF(IMODE.EQ.0)GOTO 6000
  7976. C IF WE JUST SAW /COMMAND, MUNGE OUT THE INITIAL /
  7977.     DO 130 I=1,131
  7978. 130    LINE(I)=LINE(I+1)
  7979.     GOTO 6000
  7980. 100    CONTINUE
  7981.     IF(IMODE.EQ.0)GOTO 6000
  7982. C INPUT DIDN'T START WITH / SO TRY AND MAKE UP AN ENTER
  7983.     IF(LINE(2).EQ.'&')GOTO 6000
  7984. C 1& 2& ETC WORK STILL AS CURSOR CONTROLS
  7985.     C2='N'
  7986.     IF(LINE(1).EQ.'"')C2='"'
  7987. C    IF(LINE(1).GE.'0'.AND.LINE(1).LE.'9')C2='V'
  7988.     IF(LINE(1).LT.'0'.OR.LINE(1).GT.'9')GOTO 170
  7989. C INITIAL CHAR IS A DIGIT. IF 2ND CHAR IS ALSO A DIGIT OR
  7990. C SOMETHING REASONABLE THEN TREAT AS "EV" CMD. OTHERWISE
  7991. C JUST PASS AS A COMMAND SO CURSOR CTLS WORK STILL.
  7992.     IF(LINE(2).LE.' ')GOTO 6000
  7993. C ALLOW DIGIT FOLLOWED BY SPACE OR C.R. TO BE JUST CURSOR MOVE
  7994.     C2='V'
  7995. 170    CONTINUE
  7996. C MOVE DOWN PAST 'EV'
  7997.     II=3
  7998. C ALLOW US TO REMOVE INITIAL " IN E" CASE...
  7999.     IF(C2.EQ.'"')II=2
  8000.     DO 150 I=1,129
  8001.     M=133-I
  8002.     MM=M-II
  8003. 150    LINE(M)=LINE(MM)
  8004.     LINE(1)='E'
  8005.     LINE(2)=C2
  8006.     LINE(3)=' '
  8007.     GOTO 6000
  8008. 900    LINE(1)='*'
  8009. C MAKE COMMENT, THEN GO
  8010. 6000    CONTINUE
  8011. C MAINTAIN MODE FOR REST OF WORLD
  8012.     MODPUB=IMODE
  8013.     RETURN
  8014.     END
  8015. c -h- gtprd.for    Fri Aug 22 13:17:12 1986    
  8016.     SUBROUTINE GTPRD(IA1,IA2,IB1,IB2,IR1,IR2,N,M,L)
  8017.     Include Aparms.inc
  8018.     REAL*8 A,B,R
  8019.       DIMENSION A(1),B(1),R(1)
  8020. C SPECIAL MATRIX MULTIPLY WITHIN SPREADSHEET MATRIX
  8021.     IAB=(IA2-1)*MCols+IA1-1
  8022.     IBB=(IB2-1)*MCols+IB1-1
  8023.     IRB=(IR2-1)*MCols+IR1-1
  8024.     DO 10 K=1,L
  8025.     DO 10 J=1,M
  8026.     NL=(J-1)*MCols+K
  8027.     R(1)=0.
  8028.     CALL XVBLST(NL+IRB,0,R)
  8029.     DO 10 I=1,N
  8030. C INVERT ROW/COLUMN USE FOR MATRIX A
  8031.     NM=(I-1)*MCols+J
  8032.     ML=(I-1)*MCols+K
  8033.     CALL XVBLGT(IAB+NM,0,A)
  8034.     CALL XVBLGT(IBB+ML,0,B)
  8035.     A(1)=A(1)*B(1)
  8036.     CALL XVBLGT(IRB+NL,0,R)
  8037.     R(1)=R(1)+A(1)
  8038.     CALL XVBLST(IRB+NL,0,R)
  8039. C    R(NL)=R(NL)+A(NM)*B(ML)
  8040. 10    CONTINUE
  8041.       RETURN
  8042.       END
  8043. c -h- index.fdd    Fri Aug 22 13:20:45 1986    
  8044.       INTEGER FUNCTION INDX ( STR, C )
  8045. C
  8046.     INTEGER*4 C
  8047.       CHARACTER * 1 STR ( 1 )
  8048. C
  8049. C LIMIT RANGE OF SEARCH TO 256 BYTES. THIS IS ARBITRARY BUT I DOUBT
  8050. C ANALYTICALC WILL EVER DEAL IN LONGER STRINGS THAN THIS AND
  8051. C SEARCHES ALL OVER THE CREATION ARE TO BE AVOIDED.
  8052.     I3B=0
  8053.       DO 20019  I = 1, 256
  8054.       IF (ICHAR(STR(I)).NE.0) GOTO 20021
  8055. C RETURN INDEX AS EITHER THE LOCATION OF THE CHARACTER OR 0
  8056.       INDX=0
  8057.       RETURN
  8058. 20021 CONTINUE
  8059.     IF(ICHAR(STR(I)).EQ.255)I3B=3
  8060.     IF(I3B.LE.0)GOTO 2000
  8061. C SKIP ENCODED VARIABLES
  8062.     I3B=I3B-1
  8063.     GOTO 20019
  8064. 2000    CONTINUE
  8065.       IF (.NOT.( STR ( I ) .EQ. CHAR(C) )) GOTO 20023
  8066.     ix=i
  8067.     if(i.gt.250)ix=0
  8068.       INDX = ( IX )
  8069.       RETURN
  8070. 20023 CONTINUE
  8071. 20022 CONTINUE
  8072. C
  8073. 20019 CONTINUE
  8074. 20020 CONTINUE
  8075.     INDX=255
  8076.     RETURN
  8077.       END
  8078. c -h- in2as.for    Fri Aug 22 13:21:02 1986    
  8079.     SUBROUTINE IN2AS(ROW,CHRS)
  8080.     InTeGer*4 ROW
  8081.     CHARACTER*1 CHRS(4)
  8082.     INTEGER*4 AC,AC1,AC2
  8083.     DO 1 N1=1,4
  8084. 1    CHRS(N1)=CHAR(32)
  8085. C CONVERT ROW TO LETTERS. ASSUMES COL=2 OR MORE. ROW 1=A-Z
  8086. C ROW 2=AA-AZ, THEN BA-BZ ETC.
  8087.     AC=ROW
  8088.     DO 2 N=1,4
  8089.     M=5-N
  8090. C CONVERT BACKWARDS INTO CHRS
  8091.     AC1=(AC/26)
  8092.     AC2=AC1*26
  8093.     IX=AC-AC2
  8094.     IF(.NOT.(IX.EQ.0.AND.AC1.GT.0))GOTO 772
  8095. C CORRECT SO WE GET Z, NOT A<NULL> FOR LABELS.
  8096.     IX=26
  8097.     AC1=AC1-1
  8098. 772    CONTINUE
  8099.     IF(IX.GT.0)CHRS(M)=CHAR(IX+64)
  8100. C CONVERT TO ASCII A-Z CHARACTER
  8101.     AC=AC1
  8102. 2    CONTINUE
  8103. C JUST IGNORE ANY OVERFLOW.
  8104.     RETURN
  8105.     END
  8106. c -h- indxq.for    Fri Aug 22 13:21:14 1986    
  8107.       INTEGER FUNCTION INDXQ ( STR, C )
  8108. C
  8109.     INTEGER*4 C
  8110.       CHARACTER * 1 STR ( 1 )
  8111. C
  8112. C LIMIT RANGE OF SEARCH TO 256 BYTES. THIS IS ARBITRARY BUT I DOUBT
  8113. C ANALYTICALC WILL EVER DEAL IN LONGER STRINGS THAN THIS AND
  8114. C SEARCHES ALL OVER THE CREATION ARE TO BE AVOIDED.
  8115.     I3B=0
  8116.       DO 20019  I = 1, 256
  8117.       IF (ICHAR(STR(I)).NE.0) GOTO 20021
  8118. C RETURN INDEX AS EITHER THE LOCATION OF THE CHARACTER OR OF THE
  8119. C END OF THE STRING FOR ANALYTICALC. NOTE THAT THIS DIFFERS
  8120. C FROM USUAL RATFOR VERSION.
  8121.       INDXQ=I
  8122.       RETURN
  8123. 20021 CONTINUE
  8124.     IF(ICHAR(STR(I)).EQ.255)I3B=3
  8125.     IF(I3B.LE.0)GOTO 2000
  8126. C SKIP ENCODED VARIABLES
  8127.     I3B=I3B-1
  8128.     GOTO 20019
  8129. 2000    CONTINUE
  8130.       IF (.NOT.( STR ( I ) .EQ. CHAR(C) )) GOTO 20023
  8131.       INDXQ = ( I )
  8132.       RETURN
  8133. 20023 CONTINUE
  8134. 20022 CONTINUE
  8135. C
  8136. 20019 CONTINUE
  8137. 20020 CONTINUE
  8138.     INDXQ=0
  8139.     RETURN
  8140.       END
  8141. c -h- inpost.for    Fri Aug 22 13:21:23 1986    
  8142.     SUBROUTINE INPOST (RETCD)
  8143. C COPYRIGHT (C) 1983 GLENN EVERHART
  8144. C ALL RIGHTS RESERVED
  8145. C 60=MAX REAL ROWS
  8146. C 301=MAX REAL COLS
  8147. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  8148. C VBLS AND TYPE DIMENSIONED 60,301
  8149. C **************************************************
  8150. C *                                                *
  8151. C *            SUBROUTINE  INPOST                  *
  8152. C *                                                *
  8153. C **************************************************
  8154. C
  8155. C
  8156. C  CONVERTS THE INPUT STRING (INFIX NOTATION) TO POSTFIX
  8157. C  FOR LATER EVALUATION BY POSTVL
  8158. C
  8159. C
  8160. C
  8161. C  MODIFICATION CODES:  M3,M10
  8162. C
  8163. C
  8164. C MODIFIED 10-MAR-78 P.B. CHANGED STACK VALUE FOR FUNCTIONS FROM 15 TO 45
  8165. C   THIS CORRECTS IMPROPER EVALUATION OF SQRT(1.)-2.
  8166. C
  8167. C
  8168. C
  8169. C
  8170. C INPOST CALLS
  8171. C
  8172. C  ERRMSG   PRINTS ERROR MESSAGES
  8173. C  NEXTEL   GETS THE NEXT ELEMENT FROM LINE(80)
  8174. C
  8175. C
  8176. C
  8177. C INPOST IS CALLED BY CALC
  8178. C
  8179. C
  8180. C
  8181. C
  8182. C
  8183. C
  8184. C        THE VARIABLE AND FUNCTION CODES.
  8185. C TABLE ALSO GIVES COMPARE VALUES AND STACK VALUES OF
  8186. C FUNCTIONS THAT OCCUR WHEN EXPRESSIONS ARE EVALUATED.
  8187. C
  8188. C
  8189. C
  8190. C
  8191. C    STACK
  8192. C    ELEMENT                COMPARE    STACK
  8193. C    CODE    TYPE        BYTES    VALUE    VALUE
  8194. C
  8195. C    0    UNDEFINED    -    -    -
  8196. C    1    ASCII        1    -    -
  8197. C    2    DECIMAL        8    -    -
  8198. C    3    HEXADECIMAL    4    -    -
  8199. C    4    INTEGER        4    -    -
  8200. C    5    MULT.PREC.(10)    20    -    -
  8201. C    6    MULT.PREC.(8)    20    -    -
  8202. C    7    MULT.PREC.(16)    20    -    -
  8203. C    8    OCTAL        4    -
  8204. C    9    REAL        8    -    -
  8205. C    10-30    UNDEFINED    -    -    -
  8206. C
  8207. C    ----------FUNCTIONS------------
  8208. C
  8209. C    31    ABS (=DABS)    -    70    45
  8210. C    32    IABS        -    70    45
  8211. C    33    FLOAT        -    70    45
  8212. C    34    IFIX        -    70    45
  8213. C    35    AINT        -    70    45
  8214. C    36    INT (=IDINT)    -    70    45
  8215. C    37    EXP (=DEXP)    -    70    45
  8216. C    38    ALOG (=DLOG)    -    70    45
  8217. C    39    ALOG10(=DLOG10)    -    70    45
  8218. C    40    SQRT (=DSQRT)    -    70    45
  8219. C    41    SIN (=DSIN)    -    70    45
  8220. C    42    COS (=DCOS)    -    70    45
  8221. C    43    TANH (=DTANH)    -    70    45
  8222. C    44    ATAN (=DATAN)    -    70    45
  8223. C    45-47    ASIN,ACOS,TAN    -    70    45
  8224. C    45    RESERVED    -    -    -
  8225. C       48-100  RESERVED        -       -       -
  8226. C
  8227. C       110     (               -       70      15
  8228. C       111     UNARY -         -       50      49
  8229. C       112     **              -       40      39
  8230. C       113     *               -       30      31
  8231. C       114     /               -       30      31
  8232. C       115     +               -       20      21
  8233. C       116     -               -       20      21
  8234. C       117     )               -       10      -
  8235. C
  8236. C       200     =               -       10      10
  8237. C
  8238. C
  8239. C
  8240. C    VARIABLE      USE
  8241. C
  8242. C    I,K          HOLDS TEMPORARY InTeGer*4 VALUES.
  8243. C    LASTOP       HOLDS THE TYPE OF LAST ELEMENT OBTAINED
  8244. C                 ON LINE(80). SET AT 0 AT BEGINNING OF EXPRESSION.
  8245. C                 USED BY NEXTEL TO IDENTIFY UNARY OPERATORS.
  8246. C    NONBLK       POINTER IN LINE(80). NEXTEL STARTS SCAN AT NONBLK+1.
  8247. C    OPVAL(200,2)   HOLDS THE COMPARE AND STACK VALUE OF EACH OPERATOR.
  8248. C    PARVAL       HOLDS 110 WHICH IS THE CODE FOR '(' IN STACK 2.
  8249. C    RETCD        RETURN CODE. 1=O.K.  2=ERROR.
  8250. C    RETCD2       RETURN CODE FOR CALL TO NEXTEL.
  8251. C    RETTYP       HOLDS TYPE OF NEXT ELEMENT IN LINE, EITHER A FUNCTION
  8252. C                 CODE OR A DATA TYPE CODE.
  8253. C    RETVAL(100)  HOLDS VALUE OF NEXT ELEMENT IN LINE(80).
  8254. C    ST1LIM       HOLDS LIMIT OF STACK 1.
  8255. C    ST2LIM       HOLDS LIMIT OF STACK 2.
  8256. C    ST1PT        STACK 1 POINTER.
  8257. C    ST2PT        STACK 2 POINTER.
  8258. C    ST1TYP       TYPE OF EACH ELEMENT IN STACK 1
  8259. C    ST2TYP       TYPE OF EACH ELEMENT IN STACK 2
  8260. C    VLEN         HOLDS THE NUMBER OF BYTES USED BY EACH DATA TYPE.
  8261. C
  8262. C
  8263. C
  8264. C
  8265. C    SUBROUTINE INPOST (RETCD)
  8266. C
  8267. C
  8268. C
  8269.     InTeGer*4 LEVEL,NONBLK,LEND
  8270.     InTeGer*4 LASTOP
  8271.     InTeGer*4 VIEWSW,BASED
  8272.     InTeGer*4 OPVAL(200,2),PARVAL
  8273.     InTeGer*4 RETCD,RETCD2,RETTYP
  8274.     InTeGer*4 TYPE(1,1)
  8275.     InTeGer*4 ST1TYP(40),ST2TYP(40),ST1PT,ST2PT
  8276.     InTeGer*4 ST1LIM,ST2LIM
  8277.     InTeGer*4 VLEN(9)
  8278.     InTeGer*4 I,K
  8279. C
  8280.     CHARACTER*1 LINE(80)
  8281.     CHARACTER*1 AVBLS(20,27),RETVAL(20)
  8282.     CHARACTER*1 VBLS(8,1,1)
  8283.     CHARACTER*1 STACK1(8,40),STACK2(8,40)
  8284. C
  8285. C
  8286.     COMMON /STACK/STACK1,STACK2,ST1PT,ST2PT,ST1TYP,ST2TYP,
  8287.      1  ST1LIM,ST2LIM
  8288.     COMMON /V/TYPE,AVBLS,VBLS,VLEN
  8289.     InTeGer*4 DLFG
  8290. C    COMMON/DLFG/DLFG
  8291.     InTeGer*4 KDRW,KDCL
  8292. C    COMMON/DOT/KDRW,KDCL
  8293.     InTeGer*4 DTRENA
  8294. C    COMMON/DTRCMN/DTRENA
  8295.     REAL*8 EP,PV,FV
  8296.     DIMENSION EP(20)
  8297.     INTEGER*4 KIRR
  8298. C    COMMON/ERNPER/EP,PV,FV,KIRR
  8299. c    InTeGer*4 LASTOP
  8300. C    COMMON/ERROR/LASTOP
  8301.     CHARACTER*1 FMTDAT(9,76)
  8302. C    COMMON/FMTBFR/FMTDAT
  8303.     CHARACTER*1 EDNAM(16)
  8304. C    COMMON/EDNAM/EDNAM
  8305.     InTeGer*4 MFID(2),MFMOD(2)
  8306. C    COMMON/FRM/MFID,MFMOD
  8307.     InTeGer*4 JMVFG,JMVOLD
  8308. C    COMMON/FUBAR/JMVFG,JMVOLD
  8309.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  8310.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  8311. CCC    COMMON /ERROR/ LASTOP
  8312.     COMMON LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  8313. C
  8314. C
  8315.     DATA OPVAL/30*-1,17*70,62*-1,70,50,40,30,30,20,20,10,82*-1,10,
  8316.      1             30*-1,17*45,62*-1,15,49,39,31,31,21,21,-1,82*-1,10/
  8317.     DATA PARVAL/110/
  8318. C
  8319. C
  8320. C
  8321. C
  8322. C
  8323. C  INITIALIZE STACKS, RETURN CODE DEFAULT, AND LASTOP
  8324.     RETCD=1
  8325.     ST1PT=1
  8326.     ST2PT=1
  8327.     LASTOP=0
  8328. C
  8329. C SET UP FOR NEXTEL CALL
  8330.     NONBLK=NONBLK-1
  8331. C
  8332. C
  8333. C
  8334. C
  8335. C **************************************************
  8336. C ***** GET NEXT ELEMENT OF EXPRESSION *************
  8337. C **************************************************
  8338. C
  8339. C
  8340. C
  8341. C  NEXTEL RETURNS
  8342. C    1    IF OPERAND
  8343. C    2    IF OPERATOR (VALUE IN RETTYP)
  8344. C    3    IF NO MORE ELEMENTS
  8345. C    4    IF ERROR
  8346. C
  8347. C
  8348. 50    CALL NEXTEL (RETVAL,RETTYP,RETCD2)
  8349.     GOTO (100,200,300,999),RETCD2
  8350.     STOP 50
  8351. C
  8352. C
  8353. C
  8354. C
  8355. C
  8356. C **************************************************
  8357. C ********  OPERAND FOUND, PUT ON STACK 1  *********
  8358. C **************************************************
  8359. C
  8360. C STACK 1 OVERFLOW CHECK
  8361. 100    IF (ST1PT.GT.ST1LIM) GOTO 990
  8362. C
  8363. C
  8364. C
  8365. C
  8366. C
  8367. 109    CONTINUE
  8368. C
  8369. C  SUBROUTINE ERRCX HAS ALREADY ASSURED THAT
  8370. C  IF AN OPERAND IS FOLLOWED BY AN = SIGN, THAT VARIABLE
  8371. C  IS NOT PART OF AN EXPRESSION.
  8372. C
  8373. C  VARIABLE INDEX IS TO BE PLACED IN STACK1 (1,ST1PT)
  8374. C  SO IF YOU WANTED TO SPEED THE OPERATION AT THE EXPENSE
  8375. C  OF SPACE, YOU WOULD ONLY COPY RETVAL(1) IF RETTYP < 0
  8376.     K=VLEN(IABS(RETTYP))
  8377.     DO 110 I=1,K
  8378. 110    STACK1(I,ST1PT)=RETVAL(I)
  8379.     ST1TYP(ST1PT)=RETTYP
  8380.     ST1PT=ST1PT+1
  8381.     GOTO 50
  8382. C
  8383. C
  8384. C
  8385. C
  8386. C
  8387. C
  8388. C
  8389. C
  8390. C **************************************************
  8391. C *****************  OPERATOR  *********************
  8392. C **************************************************
  8393. C
  8394. 200    CONTINUE
  8395. C
  8396. C IF NO OTHER OPERATOR ON STACK 2, PLACE ON STACK 2
  8397.     IF (ST2PT.EQ.1) GOTO 222
  8398. C
  8399. C
  8400. C COMPARE VALUE WITH OPERATOR IN STACK2, IF GREATER OR EQUAL THEN
  8401. C PLACE IN STACK 2 BECAUSE IT HAS HIGHER PRECEDENCE AND IS ASSOCIATED
  8402. C WITH PREVIOUSLY ENCOUNTERED OPERAND, IS A UNARY OPERATOR ASSOCIATED
  8403. C WITH THE FOLLOWING ELEMENT, OR IS A '(' WHICH IS SAVED UNTIL A ')'
  8404. C IS FOUND.
  8405. C
  8406.     K=ST2TYP(ST2PT-1)
  8407.     IF (OPVAL(RETTYP,1).GE.OPVAL(K,2)) GOTO 220
  8408. C
  8409. C
  8410. C IF POPPING OFF ELEMENTS FROM STACK2 BECAUSE ')' WAS FOUND THEN WHEN
  8411. C ')' IS FOUND WE GO TO 230 TO REMOVE THE OPERATOR '(' FROM STACK 2.
  8412. C
  8413.     IF (PARVAL.EQ.K) GOTO 230
  8414.     IF (ST1PT.GT.ST1LIM) GOTO 990
  8415. C
  8416. C
  8417. C
  8418. C OPERATOR ON STACK 2 GOES ONTO STACK 1.
  8419. C
  8420.     ST1TYP(ST1PT)=K
  8421.     ST1PT=ST1PT+1
  8422.     ST2PT=ST2PT-1
  8423.     GOTO 200
  8424. C
  8425. C
  8426. C  PUT OPERATOR ON STACK 2
  8427. 220    IF (ST2PT.GT.ST2LIM) GOTO 992
  8428. 222    ST2TYP(ST2PT)=RETTYP
  8429.     ST2PT=ST2PT+1
  8430.     GOTO 50
  8431. C
  8432. C
  8433. C REMOVE '(' FROM STACK 2
  8434. 230    ST2PT=ST2PT-1
  8435.     GOTO 50
  8436. C
  8437. C
  8438. C
  8439. C
  8440. C
  8441. C **************************************************
  8442. C ******* NO MORE ELEMENTS IN LINE *****************
  8443. C **************************************************
  8444. C
  8445. C CLEAN OFF STACK 2
  8446. 300    IF (ST2PT.EQ.1) GOTO 1000
  8447. C
  8448. C IF A '(' GO TO 350 TO THROW IT AWAY.
  8449.     IF (ST2TYP(ST2PT-1).EQ.PARVAL) GOTO 350
  8450.     IF (ST1PT.GT.ST1LIM) GOTO 990
  8451. C
  8452. C
  8453. C
  8454. C PLACE ELEMENT ON STACK 2 ONTO STACK 1.
  8455. C
  8456.     ST1TYP(ST1PT)=ST2TYP(ST2PT-1)
  8457.     ST1PT=ST1PT+1
  8458. C
  8459. C THROW AWAY '(' FROM STACK 2.
  8460. 350    ST2PT=ST2PT-1
  8461.     GOTO 300
  8462. C
  8463. C
  8464. C
  8465. C
  8466. C *** ERROR HANDLING ***
  8467. C
  8468. C STACK 1 OVERFLOW
  8469. 990    I=7
  8470.     GO TO 998
  8471. C
  8472. C STACK 2 OVERFLOW
  8473. 992    I=9
  8474. C
  8475. C
  8476. 998    CALL ERRMSG(I)
  8477. 999    RETCD=2
  8478. 1000    RETURN
  8479. C
  8480.     END
  8481. c -h- isgn.for    Fri Aug 22 13:21:52 1986    
  8482.       INTEGER FUNCTION ISGN(IARG)
  8483.       InTeGer*4 IARG
  8484.       IF(IARG.EQ.0)ISGN=0
  8485.       IF(IARG.GT.0)ISGN=1
  8486.       IF(IARG.LT.0)ISGN=-1
  8487.       RETURN
  8488.       END
  8489. c -h- jchar.for    Fri Aug 22 13:22:15 1986    
  8490.     INTEGER FUNCTION JCHAR(CHR)
  8491.     CHARACTER*1 CHR
  8492. c    INTEGER*1 ICH
  8493. C RETURN INTEGER VALUE OF CHARACTER AS IF IT WERE A SIGNED
  8494. C INTEGER BETWEEN -128 AND +127
  8495.     INTEGER*4 I
  8496. c    EQUIVALENCE(CHR,ICH)
  8497.     I=ICHAR(CHR)
  8498. c    I=ICH
  8499.     IF(I.GT.127)I=I-256
  8500.     JCHAR=I
  8501.     RETURN
  8502.     END
  8503. c -h- jmod.for    Fri Aug 22 13:22:15 1986    
  8504. C INTEGER*4 MODULO FUNCTION
  8505.     INTEGER*4 FUNCTION JMOD(I1,I2)
  8506.     INTEGER*4 I1,I2,I
  8507.     I=MOD(I1,I2)
  8508.     JMOD=I
  8509.     RETURN
  8510.     END
  8511. c -h- julasc.for    Fri Aug 22 13:22:15 1986    
  8512.     SUBROUTINE JULASC(N,DATST,IYR,IMO,IDA)
  8513. C CONVERT JULIAN DATE N INTO ASCII STRING STR
  8514.     INTEGER*4 DATST(2),DAT(2)
  8515.     CHARACTER*1 DATSTR(8)
  8516.     CHARACTER*2 YRST(1),MOST(1),DAST(1)
  8517.     EQUIVALENCE(YRST(1)(1:1),DATSTR(1)),
  8518.      1  (MOST(1)(1:1),DATSTR(4))
  8519.     EQUIVALENCE(DAT(1),DATSTR(1))
  8520.     EQUIVALENCE(DAST(1)(1:1),DATSTR(7))
  8521.     InTeGer*4 MLEN(12)
  8522.     DATA MLEN/31,28,31,30,31,30,31,31,30,31,30,31/
  8523.     DATSTR(3)='/'
  8524.     DATSTR(6)='/'
  8525. C FIRST SUBTRACT OFF WHOLE YEARS
  8526.     IYR=N/365
  8527.     N=N-(365*IYR)
  8528. C ADJUST FOR LEAP YRS SINCE 1981
  8529.     IAC=IYR/4
  8530.     N=N-IAC
  8531. C Account for when this year is a leap year
  8532.     MLEN(2)=28
  8533.     IF(Mod((IYR+81),4).eq.0) MLEN(2)=29
  8534. c (OK for rest of 20th century, anyhow.)
  8535. C (Also OK in 21st, since 2000 IS a leap year (divisible by 400))
  8536. C NOW SUBTRACT OFF MONTHS AS LONG AS POSSIBLE
  8537.     DO 1 NN=1,12
  8538.     IMO=NN
  8539.     IF(N.LE.MLEN(NN))GOTO 2
  8540.     N=N-MLEN(NN)
  8541. 1    CONTINUE
  8542. 2    CONTINUE
  8543.     IDA=N
  8544.     IYR=IYR+81
  8545.     WRITE(YRST(1)(1:2),3,ERR=5)IYR
  8546. C    ENCODE(2,3,YRST,ERR=5)IYR
  8547. 3    FORMAT(I2)
  8548.     WRITE(MOST(1)(1:2),3,ERR=5)IMO
  8549. C    ENCODE(2,3,MOST,ERR=5)IMO
  8550.     WRITE(DAST(1)(1:2),3,ERR=5)IDA
  8551. C    ENCODE(2,3,DAST,ERR=5)IDA
  8552. 5    CONTINUE
  8553.     IF(DATSTR(1).EQ.' ')DATSTR(1)='0'
  8554.     IF(DATSTR(4).EQ.' ')DATSTR(4)='0'
  8555.     IF(DATSTR(7).EQ.' ')DATSTR(7)='0'
  8556.     DATST(1)=DAT(1)
  8557.     DATST(2)=DAT(2)
  8558. C USE INTEGERS SINCE REAL*8 MIGHT OMIT FULL COPY IF
  8559. C EXPONENT BYTE IS 0, AND CHARS MAY CAUSE NORMALIZATION
  8560. C PROBLEMS SOMETIMES.
  8561.     RETURN
  8562.     END
  8563. c -h- julian.for    Fri Aug 22 13:22:15 1986    
  8564. C JULIAN DATE ROUTINES
  8565. C CALLS:
  8566. C    N=JULIAN(YY/MM/DD)
  8567. C    RETURNS JULIAN DATE BASED ON 1/1/80 FOR THAT DATE
  8568. C
  8569. C    CALL JULASC(N,STRADR)
  8570. C    TAKES JULIAN DATE AND DECODES TO ASCII YY/MM/DD
  8571. C
  8572. C    N=JULMDY(IYR,IMO,IDA)
  8573. C    RETURNS JULIAN DATE GIVEN SEPARATE Y,M,D
  8574. C
  8575.     FUNCTION JULIAN(DATST)
  8576.     INTEGER*4 DATST(2),DAT(2)
  8577.     CHARACTER*1 DATSTR(8)
  8578.  
  8579.     CHARACTER*1 YRST(2),MOST(2),DAST(2)
  8580.     CHARACTER*2 YRST2,MOST2,DAST2
  8581.     EQUIVALENCE(YRST2(1:1),YRST(1),DATSTR(1),DAT(1)),
  8582.      1  (MOST2(1:1),MOST(1),DATSTR(4)),
  8583.      2  (DAST2(1:1),DAST(1),DATSTR(7))
  8584. C    EQUIVALENCE(DATSTR(1),DAT(1))
  8585. C    EQUIVALENCE(YRST(1),DATSTR(1)),(MOST(1),DATSTR(4))
  8586. C    EQUIVALENCE(DAST(1),DATSTR(7))
  8587.     DAT(1)=DATST(1)
  8588.     DAT(2)=DATST(2)
  8589.     IJUL=1
  8590.     READ(YRST2(1:2),1,ERR=2)IYR
  8591. C    DECODE(2,1,YRST,ERR=2)IYR
  8592. 1    FORMAT(I2)
  8593.     READ(MOST2(1:2),1,ERR=2)IMO
  8594.     READ(DAST2(1:2),1,ERR=2)IDA
  8595. C    DECODE(2,1,MOST,ERR=2)IMO
  8596. C    DECODE(2,1,DAST,ERR=2)IDA
  8597.     IJUL=JULMDY(IYR,IMO,IDA)
  8598. 2    CONTINUE
  8599.     JULIAN=IJUL
  8600.     RETURN
  8601.     END
  8602. c -h- julmdy.for    Fri Aug 22 13:22:15 1986    
  8603.     FUNCTION JULMDY(IYR,IMO,IDA)
  8604.     InTeGer*4 MLEN(12)
  8605.     DATA MLEN/31,28,31,30,31,30,31,31,30,31,30,31/
  8606. C JULIAN DATE FROM Y,M,D
  8607. C BASE=1/1/81
  8608.     IJUL=1
  8609.     IF(IYR.LT.80)GOTO 999
  8610.     IYR=IYR-81
  8611.     IF(IMO.LE.0.OR.IMO.GT.12)GOTO 999
  8612.     IF(IDA.GT.31)GOTO 999
  8613. C JUST RETURN ILLEGAL ENTRIES AS 1/1/80
  8614.     AC=365.25*FLOAT(IYR)
  8615.     IAC=AC
  8616. C SLIGHTLY CRUDE BUT WORKABLE TREATMENT OF YEARS
  8617.     IJUL=IJUL+IAC
  8618. C NOW ADD IN MONTHS.
  8619.     IF(IMO.GT.2.AND.MOD(IYR+1,4).EQ.0)IJUL=IJUL+1
  8620. C ABOVE ACCOUNTS FOR LEAP YEARS
  8621.     III=IMO-1
  8622.     IF(III.LE.0)GOTO 22
  8623.     DO 2 N=1,III
  8624. 2    IJUL=IJUL+MLEN(N)
  8625. 22    CONTINUE
  8626. C NEXT DO DAYS
  8627.     IJUL=IJUL+IDA-1
  8628. C JUST ADD IN DAYS. SHOULD BE GOOD ENOUGH.
  8629. 999    CONTINUE
  8630.     JULMDY=IJUL
  8631.     RETURN
  8632.     END
  8633. c -h- jvblgt.for    Fri Aug 22 13:22:15 1986    
  8634.         SUBROUTINE JVBLGT(ID1,ID2,ID3,IVAL)
  8635. C
  8636. C JVBLGT - GET INTEGER*4 WORD OF 3 DIM VBLS ARRAY, ORIGINALLY
  8637. C  DIMENSIONED (2,60,301). HANDLE BY CALLING XVBLGT TO GET
  8638. C  CORRECT 8 BYTE VARIABLE, AND PULLING OUT CORRECT ONE
  8639.         InTeGer*4 ID1,ID2,ID3
  8640.         INTEGER*4 IVAL,LL(2)
  8641.         REAL*8 XX
  8642.         EQUIVALENCE(LL(1),XX)
  8643.         CALL XVBLGT(ID2,ID3,XX)
  8644.         IVAL=LL(ID1)
  8645.         RETURN
  8646.         END
  8647. c -h- jvblst.for    Fri Aug 22 13:22:15 1986    
  8648.         SUBROUTINE JVBLST(ID1,ID2,ID3,IVAL)
  8649. C JVBLST - SET I*4 WORD OF 3 DIM VBLS ARRAY, ORIGINALLY
  8650. C  DIMENSIONED (2,60,301). HANDLE BY CALLING XVBLST TO GET
  8651. C  CORRECT 8 BYTE VARIABLE, AND PUTTING IN CORRECT ONE
  8652.         InTeGer*4 ID1,ID2,ID3
  8653.         INTEGER*4 IVAL,LL(2)
  8654.         REAL*8 XX
  8655.         EQUIVALENCE(LL(1),XX)
  8656. C GET THE DESIRED 8 BYTES, THEN CHANGE THE ONES WE WANT. THEN...
  8657.         CALL XVBLGT(ID2,ID3,XX)
  8658.         LL(ID1)=IVAL
  8659. C PUT BACK THE 8 BYTES.
  8660.         CALL XVBLST(ID2,ID3,XX)
  8661.         RETURN
  8662.         END
  8663. c -h- mdet.for    Fri Aug 22 13:25:39 1986    
  8664.     SUBROUTINE MDET(XVBLS,I1,I2,J1,J2,DET)
  8665.     Include Aparms.inc
  8666.     REAL*8 XVBLS(1),DET,SUMA,SUMB
  8667. C NOTE XVBLS IS 60 BY 301 MATRIX IN PORTACALC
  8668. C I1,I2 ARE TOP COL,ROW COORD; J1,J2 ARE BOTTOM
  8669. C STORAGE OF XVBLS IS (COL,ROW) SO LOCATIONS INSIDE
  8670. C IT ARE
  8671. C  ADDR=(ROW-1)*60+COL (60 IS # OF COLS)
  8672.     DET=0.
  8673.     N=J1-I1+1
  8674.     M=J2-I2+1
  8675.     IF(N.NE.M)RETURN
  8676.     IF(N.LE.1)RETURN
  8677. C ONLY SQUARE MATRICES MAY HAVE NONZERO DETERMINANTS
  8678. C ALSO, DIMENSION HAS TO BE > 1
  8679.     NN=N
  8680. C  FIXUP... (OK FOR N=2,3 ANYHOW)
  8681.     IF(N.EQ.2)NN=N-1
  8682. C  SUM OVER DIAGS...
  8683. C MULTIPLY DIAGONALS FROM TOP AND BOTTOM ROWS OF MATRIX AND GET
  8684. C DIFFERENCE EACH TIME FOR ACCURACY
  8685.     DO 1 N1=1,NN
  8686.     SUMA=1.
  8687.     SUMB=1.
  8688.     DO 2 N2=1,N
  8689.     NCL=N1+N2-1
  8690.     N2L=N+1-N2
  8691.     IF(NCL.GT.N)NCL=NCL-N
  8692. C NOW MULTIPLY SUMA (POSITIVE TERMS) BY X(NCL,N2) AND SUMB(NEG TERMS)
  8693. C BY X(NCL,N2L)
  8694.     LA=(N2-2+I2)*MCols+I1+NCL-1
  8695.     LB=(N2L-2+I2)*MCols+I1+NCL-1
  8696.     CALL XVBLGT(LA,0,XVBLS(1))
  8697.     SUMA=SUMA*XVBLS(1)
  8698.     CALL XVBLGT(LB,0,XVBLS(1))
  8699.     SUMB=SUMB*XVBLS(1)
  8700. 2    CONTINUE
  8701. C NOW ACCUMULATE TERMS IN DETERMINANT
  8702.     DET=DET+SUMA-SUMB
  8703. C DO IN THIS ORDER TO AVOID EXCESSIVE LOSS OF PRECISION DUE TO
  8704. C DIFFERENCES OF LARGE TERMS. THIS IS BAD ENOUGH AS IT IS...
  8705. 1    CONTINUE
  8706.     RETURN
  8707.     END
  8708. c -h- mthini.for    Fri Aug 22 13:25:45 1986    
  8709.     SUBROUTINE MTHINI(INDEXF,AC,SS,CTR,ACX)
  8710.     DIMENSION EP(20)
  8711.     InTeGer*4 DLFG
  8712. C    COMMON/DLFG/DLFG
  8713.     InTeGer*4 KDRW,KDCL
  8714. C    COMMON/DOT/KDRW,KDCL
  8715.     InTeGer*4 DTRENA
  8716. C    COMMON/DTRCMN/DTRENA
  8717.     REAL*8 EP,PV,FV
  8718.     DIMENSION EP(20)
  8719.     INTEGER*4 KIRR
  8720. C    COMMON/ERNPER/EP,PV,FV,KIRR
  8721.     InTeGer*4 LASTOP
  8722. C    COMMON/ERROR/LASTOP
  8723.     CHARACTER*1 FMTDAT(9,76)
  8724. C    COMMON/FMTBFR/FMTDAT
  8725.     CHARACTER*1 EDNAM(16)
  8726. C    COMMON/EDNAM/EDNAM
  8727.     InTeGer*4 MFID(2),MFMOD(2)
  8728. C    COMMON/FRM/MFID,MFMOD
  8729.     InTeGer*4 JMVFG,JMVOLD
  8730. C    COMMON/FUBAR/JMVFG,JMVOLD
  8731.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  8732.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  8733. CCC    REAL*8 EP,PV,FV
  8734. CCC    COMMON/ERNPER/EP,PV,FV,KIRR
  8735.     REAL*8 AC,SS,CTR,ACX
  8736.     KIRR=0
  8737.     SS=0.
  8738.     CTR=0.
  8739.     ACX=0.
  8740.     DO 1 N=1,20
  8741. 1    EP(N)=0.
  8742.     AC=0.
  8743.     IF(INDEXF.EQ.1)AC=1.E20
  8744.     IF(INDEXF.EQ.2)AC=-1.E20
  8745.     RETURN
  8746.     END
  8747. c -h- mtxequ.for    Fri Aug 22 13:25:54 1986    
  8748.        SUBROUTINE MTXEQU(A1,A2,B1,B2,N,M,D)
  8749.     Include AParms.inc
  8750. C A1,A2 ARE DIMENSIONS OF A SUBMATRIX ORIGIN IN XVBLS
  8751. C B1,B2 ARE DIMS OF B SUBMATRIX
  8752. C
  8753. C NOTE THIS PROGRAM MUST BE MODIFIED TO WORK WITHIN THE SPREAD
  8754. C SHEET MATRIX RATHER THAN JUST ASSUMING THAT THE N DIMENSION
  8755. C AND M DIMENSION GIVE THE STORAGE ADDRESSES... ALTERNATIVELY,
  8756. C THE PROGRAM MUST OPERATE ONLY ON COPIED, DENSELY STORED
  8757. C MATRICES.
  8758. C
  8759. C
  8760. C   ORIGINAL PROGRAM TEXT FOLLOWS:
  8761. C       DIMENSION A(1),B(1)
  8762. CC ALTER DECLARATIONS FOR USE WITH SPREAD SHEET
  8763. C    REAL*8 A,B
  8764. C       KMAX=N-1
  8765. C       DO 90 K=1,KMAX
  8766. C       AMAX=0.
  8767. C       J2=K
  8768. C       DO 20 J1=K,N
  8769. C       IK=(J1-1)*N+K
  8770. C       IF(ABS(AMAX)-ABS(A(IK)))10,20,20
  8771. C10       AMAX=A(IK)
  8772. C       J2=J1
  8773. C20       CONTINUE
  8774. CC       EXCHANGE ROW K,J2 IF NECESSARY
  8775. C       IF(J2-K)30,60,30
  8776. C30       DO 40 J=K,N
  8777. C       J3=(K-1)*N+J
  8778. C       J4=(J2-1)*N+J
  8779. C       SAVE=A(J3)
  8780. C       A(J3)=A(J4)
  8781. C       A(J4)=SAVE
  8782. C40       CONTINUE
  8783. C       DO 50 J=1,M
  8784. C       J3=(K-1)*M+J
  8785. C       J4=(J2-1)*M+J
  8786. C       SAVE=B(J3)
  8787. C       B(J3)=B(J4)
  8788. C50       B(J4)=SAVE
  8789. CC       REDUCTION
  8790. C60       K1=K+1
  8791. C       KK=(K-1)*N+K
  8792. C       DO 80 I=K1,N
  8793. C       IK=(I-1)*N+K
  8794. C       DO 70 J=K1,N
  8795. C       IJ=(I-1)*M+J
  8796. C       KJ=(K-1)*M+J
  8797.  
  8798. C70       A(IJ)=A(IJ)-A(KJ)*A(IK)/A(KK)
  8799. C       DO 80 J=1,M
  8800. C       IJ=(I-1)*M+J
  8801. C       KJ=(K-1)*N+J
  8802. C80       B(IJ)=B(IJ)-B(KJ)*A(IK)/A(KK)
  8803. C90       CONTINUE
  8804. CC       SUBSTITUTE BACK
  8805. CC       NN=(N-1)*N+N
  8806. C       NN=N*N
  8807. C       DO 110 J=1,M
  8808. C       NJ=(N-1)*M+J
  8809. C       B(NJ)=B(NJ)/A(NN)
  8810. C       I1MAX=N-1
  8811. C       IF(I1MAX)110,110,95
  8812. C95       DO 111 I1=1,I1MAX
  8813. C       I=N-I1
  8814. C       IJ=(I-1)*M+J
  8815. C       II=(I-1)*N+I
  8816. C       I2=I+1
  8817. C       DO 100 L=I2,N
  8818. C       IL=(I-1)*N+L
  8819. C       LJ=(L-1)*M+J
  8820. C100       B(IJ)=B(IJ)-A(IL)*B(LJ)
  8821. C       B(IJ)=B(IJ)/A(II)
  8822. C111       CONTINUE
  8823. C110       CONTINUE
  8824. C       RETURN
  8825. C       END
  8826.     INTEGER A1,A2,B1,B2
  8827. C       DIMENSION A(1),B(1)
  8828. C ALTER DECLARATIONS FOR USE WITH SPREAD SHEET
  8829. C NOTE THAT OUR COLUMN DIMENSION IS 60, NOT N OR M HERE
  8830. C SUBSCRIPTS ARE (ROW-1)*COL-DIMENSION + COL
  8831. C  THEREFORE, CHANGE *N OR *M IN SUBSCRIPT COMPUTATIONS TO
  8832. C  *60
  8833.     REAL*8 A,B,AW1,AW2,BW1,BW2,AW3,AW4,AMAX
  8834.     INTEGER ABASE,BBASE
  8835.     ABASE=(A2-1)*MCols+A1-1
  8836.     BBASE=(B2-1)*MCols+B1-1
  8837.     D=1.
  8838.        KMAX=N-1
  8839.        DO 90 K=1,KMAX
  8840.        AMAX=0.
  8841.        J2=K
  8842.        DO 20 J1=K,N
  8843.        IK=(J1-1)*MCols+K
  8844.     CALL XVBLGT(IK+ABASE,0,A)
  8845.        IF(DABS(AMAX)-DABS(A))10,20,20
  8846. 10       AMAX=A
  8847.        J2=J1
  8848. 20       CONTINUE
  8849. C       EXCHANGE ROW K,J2 IF NECESSARY
  8850.        IF(J2-K)30,60,30
  8851. 30       DO 40 J=K,N
  8852.        J3=(K-1)*MCols+J
  8853.        J4=(J2-1)*MCols+J
  8854.     CALL XVBLGT(J3+ABASE,0,SAVE)
  8855. C       SAVE=A(J3)
  8856.     CALL XVBLGT(J4+ABASE,0,AW1)
  8857.     CALL XVBLST(J3+ABASE,0,AW1)
  8858.     CALL XVBLST(J4+ABASE,0,SAVE)
  8859. C       A(J3)=A(J4)
  8860. C       A(J4)=SAVE
  8861. 40       CONTINUE
  8862.        DO 50 J=1,M
  8863.        J3=(K-1)*MCols+J
  8864.        J4=(J2-1)*MCols+J
  8865. C       SAVE=B(J3)
  8866. C       B(J3)=B(J4)
  8867. C50       B(J4)=SAVE
  8868.     CALL XVBLGT(J3+BBASE,0,SAVE)
  8869.     CALL XVBLGT(J4+BBASE,0,BW1)
  8870.     CALL XVBLST(J3+BBASE,0,BW1)
  8871.     CALL XVBLST(J4+BBASE,0,SAVE)
  8872. 50    CONTINUE
  8873. C       REDUCTION
  8874. 60       K1=K+1
  8875.        KK=(K-1)*MCols+K
  8876.     CALL XVBLGT(KK+ABASE,0,A)
  8877.     IF(A.EQ.0)GOTO 999
  8878. C    IF(A(KK).EQ.0.)GOTO 999
  8879.        DO 80 I=K1,N
  8880.        IK=(I-1)*MCols+K
  8881.        DO 70 J=K1,N
  8882.        IJ=(I-1)*MCols+J
  8883.        KJ=(K-1)*MCols+J
  8884. C70       A(IJ)=A(IJ)-A(KJ)*A(IK)/A(KK)
  8885.     CALL XVBLGT(IJ+ABASE,0,AW1)
  8886.     CALL XVBLGT(KJ+ABASE,0,AW2)
  8887.     CALL XVBLGT(IK+ABASE,0,AW3)
  8888.     CALL XVBLGT(KK+ABASE,0,AW4)
  8889.     AW1=AW1-AW2*AW3/AW4
  8890.     CALL XVBLST(IJ+ABASE,0,AW1)
  8891. 70    CONTINUE
  8892.        DO 80 J=1,M
  8893.        IJ=(I-1)*MCols+J
  8894.        KJ=(K-1)*MCols+J
  8895. C80       B(IJ)=B(IJ)-B(KJ)*A(IK)/A(KK)
  8896.     CALL XVBLGT(IJ+BBASE,0,BW1)
  8897.     CALL XVBLGT(KJ+BBASE,0,BW2)
  8898.     BW1=BW1-BW2*AW3/AW4
  8899.     CALL XVBLST(IJ+BBASE,0,BW1)
  8900. 80    CONTINUE
  8901. 90       CONTINUE
  8902. C       SUBSTITUTE BACK
  8903.        NN=(N-1)*MCols+N
  8904. C       NN=N*N
  8905.     CALL XVBLGT(NN+ABASE,0,AW1)
  8906.     IF(AW1.EQ.0.)GOTO 999
  8907.        DO 110 J=1,M
  8908.        NJ=(N-1)*MCols+J
  8909. C       B(NJ)=B(NJ)/A(NN)
  8910.     CALL XVBLGT(NJ+BBASE,0,BW1)
  8911.     BW1=BW1/AW1
  8912.     CALL XVBLST(NJ+BBASE,0,BW1)
  8913.        I1MAX=N-1
  8914.        IF(I1MAX)110,110,95
  8915. 95       DO 111 I1=1,I1MAX
  8916.        I=N-I1
  8917.        IJ=(I-1)*MCols+J
  8918.        II=(I-1)*MCols+I
  8919.        I2=I+1
  8920.     CALL XVBLGT(II+ABASE,0,AW1)
  8921.        DO 100 L=I2,N
  8922.        IL=(I-1)*MCols+L
  8923.        LJ=(L-1)*MCols+J
  8924. C100       B(IJ)=B(IJ)-A(IL)*B(LJ)
  8925.     CALL XVBLGT(IJ+BBASE,0,BW1)
  8926.     CALL XVBLGT(IL+ABASE,0,AW2)
  8927.     CALL XVBLGT(LJ+BBASE,0,BW2)
  8928.     BW1=BW1-AW2*BW2
  8929.     CALL XVBLST(IJ+BBASE,0,BW1)
  8930. 100    CONTINUE
  8931. C       B(IJ)=B(IJ)/A(II)
  8932.     BW1=BW1/AW1
  8933.     CALL XVBLST(IJ+BBASE,0,BW1)
  8934. 111       CONTINUE
  8935. 110       CONTINUE
  8936.        RETURN
  8937. 999    CONTINUE
  8938.     D=0.
  8939.     RETURN
  8940.        END
  8941. C *********************  AnalyF6.Ftn ###################################
  8942. c -h- varscn.for    Fri Aug 22 13:37:17 1986    
  8943. C $DO66
  8944.     SUBROUTINE VARSCN(LINE,IBGN,LEND,LSTCHR,ID1,ID2,IVALID)
  8945. C COPYRIGHT (C) 1983, 1984 GLENN AND MARY EVERHART
  8946. C ALL RIGHTS RESERVED
  8947. C
  8948. C VARSCN - SCAN COMMAND LINE FOR VARIABLE NAMES.
  8949. C
  8950. C    SCANS FOR VARIABLE NAMES OF FORM AAANNN WHERE AAA = LETTERS
  8951. C BETWEEN A AND Z UP TO NON-ALPHA, CORRESPONDING TO ROW, FOLLOWED BY
  8952. C NUMBERS IN THE 0-9 RANGE MAKING A DECIMAL COLUMN NUMBER.
  8953. C
  8954. C THE LETTERS ARE FORMED BY
  8955. C A-Z ALONE GIVE ROW 1-26, COL 1. % IS ROW 27,COL1
  8956. C A1-Z1 GIVE ROW 1-26, COL 2
  8957. C AA1-ZZ1 ARE ROW 27-52, COL 2
  8958. C
  8959. C In this version we also recognize cell names using an optional third
  8960. C dimension. Forms like B14#2 would be interpreted as cell B14 of sheet
  8961. C 2 (sheets start at 0). This is a display trick mainly, as cell offsets
  8962. C will be treated as simple 2D addresses as before. However, it will allow
  8963. C some greater automation of the notion of multiple areas. Each "page" is
  8964. C formed by adding constants KCDELT and KRDELT to the column and row
  8965. C of the base number, multiplied by the offset in sheets. These constants
  8966. C are initially zero, collapsing all "pages" on top of one another. This
  8967. C interpretation will occur provided K3DFG is 0 or positive. If it is 
  8968. C negative all 3D interpretation will be ignored, and even parsing of
  8969. C the cell names for trailing # characters will be disabled. (This will
  8970. C allow strict return to the older meanings.)
  8971.     IMPLICIT InTeGer*4 (A-Z)
  8972. C NOTE COL 1 IS DUMMY. DISPLAY THE SHEET SIDEWAYS SO WE GET USUAL VISUAL
  8973. C ROWS, COLS., AND ACCUMULATORS A-Z,% JUST APPEAR AS A FICTITIOUS ROW 0
  8974. C ON DISPLAY, INSTEAD OF REAL COLUMN 1 HERE.
  8975.     Include AParms.Inc
  8976.     DIMENSION LINE(LEND)
  8977.     CHARACTER*1 LINE
  8978.     InTeGer*4 TYPE(1,1),VLEN(9)
  8979.     REAL*8 XVBLS(1,1)
  8980.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1)
  8981.     REAL*8 XAVB,xac
  8982.     REAL*4 XAV2(2)
  8983.     CHARACTER*1 XAV1(8)
  8984.     EXTERNAL INDX
  8985.     EQUIVALENCE(XAVB,XAV2(1)),(XAVB,XAV1(1))
  8986.     EQUIVALENCE(XVBLS(1,1),VBLS(1,1,1))
  8987.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  8988. C ***<<< KLSTO COMMON START >>>***
  8989.     InTeGer*4 DLFG
  8990. C    COMMON/DLFG/DLFG
  8991.     InTeGer*4 KDRW,KDCL
  8992. C    COMMON/DOT/KDRW,KDCL
  8993.     InTeGer*4 DTRENA
  8994. C    COMMON/DTRCMN/DTRENA
  8995.     REAL*8 EP,PV,FV
  8996.     DIMENSION EP(20)
  8997.     INTEGER*4 KIRR
  8998. C    COMMON/ERNPER/EP,PV,FV,KIRR
  8999.     InTeGer*4 LASTOP
  9000. C    COMMON/ERROR/LASTOP
  9001.     CHARACTER*1 FMTDAT(9,76)
  9002. C    COMMON/FMTBFR/FMTDAT
  9003.     CHARACTER*1 EDNAM(16)
  9004. C    COMMON/EDNAM/EDNAM
  9005.     InTeGer*4 MFID(2),MFMOD(2)
  9006. C    COMMON/FRM/MFID,MFMOD
  9007.     InTeGer*4 JMVFG,JMVOLD
  9008. C    COMMON/FUBAR/JMVFG,JMVOLD
  9009.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  9010.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  9011. C ***<<< KLSTO COMMON END >>>***
  9012. CCC    InTeGer*4 DLFG
  9013. CCC    COMMON/DLFG/DLFG
  9014. C DLFG=1 IF D## FORMS ARE SEEN
  9015.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  9016.     COMMON/D2R/NRDSP,NCDSP
  9017. C NRDSP AND NCDSP ARE REAL ROW, COL OF DISPLAY ROW, COL CELLS. NOTE THAT
  9018. C NOT ALL DISPLAY CELLS ARE ALWAYS ACTUALLY SHOWN; ONLY THOSE THAT FIT
  9019. C ARE SHOWN; THE REST "EXIST" BUT DON'T APPEAR UNLESS ROWS ARE SMALL
  9020. C ENOUGH.
  9021. C
  9022. C THIS PROGRAM ALSO HANDLES CELL SPECS OF FORM
  9023. C P#+nnn#+nnn (or P#-nnn#-mmm) FOR Physical cells relative to our current
  9024. C physical cell on the sheet (clamped at boundaries), or of form
  9025. C D#+nnn#+mmm etc for Display cells relative to our current display
  9026. C location as held in the DROW,DCOL cells in commons.
  9027. C ***<<<< RDD COMMON START >>>***
  9028.     InTeGer*4 RRWACT,RCLACT
  9029. C    COMMON/RCLACT/RRWACT,RCLACT
  9030.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  9031.      1  IDOL7,IDOL8
  9032. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  9033. C     1  IDOL7,IDOL8
  9034.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  9035. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  9036.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  9037. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  9038. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  9039. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  9040.     InTeGer*4 KLVL
  9041. C    COMMON/KLVL/KLVL
  9042.     InTeGer*4 IOLVL,IGOLD
  9043. C    COMMON/IOLVL/IOLVL
  9044. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  9045. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  9046.     Integer*4 k3dfg,kcdelt,krdelt,kshtf
  9047.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  9048.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  9049.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  9050.      3  k3dfg,kcdelt,krdelt,kshtf
  9051. C ***<<< RDD COMMON END >>>***
  9052. CCC    InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6
  9053. CCC    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6
  9054. CCC    InTeGer*4 PROW,PCOL
  9055. C ! PHYSICAL ROW, COL BEING HANDLED.
  9056. CCC    InTeGer*4 DROW,DCOL,DCLV,DRWV
  9057.     InTeGer*4 RSM,CSM,AFG,ASM,VCF,CH
  9058. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  9059.     LOGICAL*4 L1,L2
  9060. C    LOGICAL*2 L63,L192,L127
  9061.     InTeGer*4 I1,I2
  9062.     InTeGer*4 I63,I192,I127
  9063.     EQUIVALENCE(I1,L1),(I2,L2)
  9064. C    EQUIVALENCE (I63,L63),(I192,L192),(L127,I127)
  9065.     DATA I63/63/,I192/192/,I127/127/
  9066. C DRWV,DCLV = # OF MAX ROWS, COLS ACTUALLY ON SCREEN NOW. DROW,DCOL
  9067. C ARE ACTUAL "CURSOR" LOCATION.
  9068. C
  9069. C ZERO OUR VARIABLES
  9070.     LPFG=0
  9071. C ! FLAG WE GOT A LOGICAL/PHYSICAL # FORM AND TYPE
  9072.     AFG=0
  9073. C ! FLAG WE SAW AN ALPHA
  9074.     ASM=0
  9075. C ! SUM OF ALPHAS HASHCODED (ACCUMULATOR)
  9076.     NSM=0
  9077. C ! ACCUMULATOR FOR NUMERICS
  9078.     NFG=0
  9079. C ! FLAG WE SAW A NUMERIC
  9080.     RSM=0
  9081. C ! AC FOR ROWS IN # FORMS
  9082.     CSM=0
  9083. C ! AC FOR COLS IN # FORMS
  9084.     ISPC=0
  9085. C ! COUNTER FOR NONSPACES SEEN (USED TO STOP ON TRAILING SPACES)
  9086.     ktpnd=0
  9087.     idol1=0
  9088.     idol2=0
  9089.     IF(LINE(IBGN).NE.'%')GOTO 2000
  9090.     ID1=27
  9091.     ID2=1
  9092.     IVALID=1
  9093.     LSTCHR=IBGN+1
  9094. C SPECIAL CASE FOR % = AC #27
  9095.     RETURN
  9096. 2000    CONTINUE
  9097.     DO 1 N=IBGN,LEND
  9098.     VCF=0
  9099.     LSTCHR=N
  9100.     CH=ICHAR(LINE(N))
  9101.     IF (CH.EQ.255)GOTO 5000
  9102. C 5000 DECODES ENCODED FORMS AND RETURNS THEM...
  9103. C
  9104. C IGNORE SPACES AND TABS IF LEADING
  9105.     IF(CH.GT.32)ISPC=ISPC+1
  9106.     IF(CH.GT.0.AND.CH.LE.32.AND.ISPC.EQ.0)GOTO 1
  9107. C SPECIAL CASE TRAILING DOLLAR SIGNS... SKIP AND FLAG
  9108.     IF(CH.NE.36)GOTO 3443
  9109. C 36 IS ASCII FOR $ SIGN
  9110. C SAW A DOLLAR SIGN
  9111.     IF(AFG.EQ.1.AND.NFG.EQ.0)IDOL1=1
  9112.     IF(AFG.EQ.1.AND.NFG.EQ.1)IDOL2=1
  9113. C LEAVES WITH IDOL1 FLAGGED AS 1 IF LETTER PART WAS FOLLOWED BY
  9114. C DOLLAR SIGN, AND IDOL2 FLAGGED IF NUMBER PART WAS FOLLOWED
  9115. C BY DOLLAR. IGNORES ALL OTHER DOLLAR SIGNS.
  9116.     GOTO 1
  9117. 3443    CONTINUE
  9118. C GET CHARACTER VALUE IN.
  9119. C MUST BE UPPERCASE.
  9120.     IF(.NOT.(CH.GE.65.AND.CH.LT.91)) GOTO 100
  9121. C CH IS AN ALPHA, RANGE A-Z
  9122.     VCF=1
  9123. C ! VALID CHAR SEEN
  9124.     AFG=1
  9125. C !SAW THE ALPHA
  9126.     IF(ASM.LT.MRC)ASM=(CH-64)+26*ASM
  9127.     IF(NFG.NE.0)GOTO 103
  9128. C FILTER OUT TOO-LARGE VALUES...
  9129. C leave the 18000 limit in for now; seems big enough!
  9130.     IF(ASM.GT.(mrc-MCols))GOTO 103
  9131. C 60 * 26 IS LIM ABOVE
  9132.     IF(CH.EQ.80)LPFG=1
  9133. C ! FLAG WE GOT PHYS. FORM MAYBE
  9134.     IF(CH.EQ.68)LPFG=2
  9135. C ! FLAG WE GOT DISPLAY FORM MAYBE
  9136. 100    CONTINUE
  9137. C EXPECT # FORMS TO HAVE # JUST AFTER 1ST ALPHA.
  9138. C 35 IS ASCII VALUE OF '#' CHAR.
  9139.     IF(CH.EQ.35)GOTO 1000
  9140. C NEXT TEST NUMERICS
  9141.     IF(.NOT.(CH.GE.48.AND.CH.LE.57))GOTO 101
  9142. C CH IS A NUMERIC, RANGE 0-9
  9143.     VCF=1
  9144. C ! VALID CHAR SEEN
  9145.     NFG=1
  9146. C ! FLAG WE SAW NUMERIC
  9147.     IF(AFG.NE.0)GOTO 102
  9148.     GOTO 103
  9149. 102    CONTINUE
  9150.     IF(NSM.LT.MRC)NSM=(CH-48)+10*NSM
  9151. C FILTER OUT TOO-LARGE VALUES EARLY
  9152. C 301 * 10 IS LIMIT...
  9153.     IF(NSM.GT.(MRC-MCols))GOTO 103
  9154. C ! CONVERT CHARS TO BINARY AS SEEN
  9155. 101    CONTINUE
  9156.     IF(VCF.EQ.0)GOTO 2
  9157. C !END ON ANY INVALID CHARACTER
  9158. 1    CONTINUE
  9159. 2    CONTINUE
  9160.     IF(AFG.EQ.0)GOTO 103
  9161.     GOTO 950
  9162. 103    CONTINUE
  9163. C INVALID ... NUMERIC AND NO PRIOR ALPHA. FLAG BAD NAME AND EXIT.
  9164.     IVALID=0
  9165.     RETURN
  9166. 950    ID1=ASM
  9167.     ID2=1+NSM
  9168. C ! NOTE ID2=1 IF NO NUMERICS SEEN, MORE OTHERWISE.
  9169.     GOTO 1201
  9170. 1000    CONTINUE
  9171. C HERE HANDLE CURRENT-REFERENCED FORMS USING # AS SPECIAL CHARACTER MEANING
  9172. C THE CURRENT POSITION. THESE TYPES OF REFERENCES MAY BE MOVED AROUND THE
  9173. C SHEET WHICH ACCOUNTS FOR THEIR USEFULNESS. SINCE THERE IS A DISPLAY
  9174. C AND PHYSICAL SHEET WHICH ARE MAPPED BY A MAPPING, ALLOW EITHER
  9175. C TO BE REFERENCED. THUS, COMPLEX CALCULATIONS MAY BE DONE BUT LARGELY
  9176. C HIDDEN. THE ACCUMULATORS MAY BE USED AS SCRATCH STORAGE FOR THIS
  9177. C SORT OF THING.
  9178. C SAW THE # SIGN, SO SEE IF THE + OR - N CAN BE DECODED.
  9179. C IF NO P OR D WAS SEEN HOWEVER WE HAVE AN INVALID NAME, SO FLAG IT.
  9180.     IF(LPFG.EQ.0)GOTO 103
  9181. C PASS THE # SIGN PRIOR TO GETTING THE NUMERIC.
  9182.     LSTCHR=LSTCHR+1
  9183.     iundr=0
  9184.     if(line(lstchr).eq.'_')iundr=1
  9185.     if(line(lstchr).eq.'$')iundr=2
  9186.     if(line(lstchr).ne.'%'.and.iundr.eq.0)goto 3900
  9187. c allow p#%ab form to mean use ac a and b to get offsets from "here"
  9188. c allow P#_ab to be absolute address ref for cells (otherwise like p#%ab)
  9189.     CSM=0
  9190.     RSM=0
  9191. C DEFAULT TO "THIS" CELL
  9192.     LSTCHR=LSTCHR+1
  9193. C PASS THE % SIGN (or other special char we recognize)
  9194.     if(Iundr.lt.2)goto 3906
  9195. c
  9196. c P#$var1var2 is a form that allows relative addressing using ANY of the
  9197. c cells for col and row. First cell is col, 2nd is row
  9198. c The pointers so derived are ABSOLUTE, relative to absolute beginning of
  9199. c the sheet. This seems to me more useful than the relative addressing forms.
  9200. c However, I dislike the offset by 1 for rows so will subtract it off so the
  9201. c accumulators will be addressed as row 0.
  9202.     kkk=lstchr
  9203.     kkkk=lstchr+20
  9204.     klstc=kkk
  9205. c
  9206. c Call copy (without this mod) of varscn subroutine to do the examining of 
  9207. c variable names, so we don't wind up recursively calling ourselves.
  9208. c
  9209.     call varsc2(line,kkk,kkkk,klstc,kr1,kr2,kvld)
  9210.     if(kvld.eq.0)goto 3906
  9211. c try normal processing if this doesn't look like regular variables
  9212.     if(line(klstc).eq.':')klstc=klstc+1
  9213.     kkk=klstc
  9214.     kkkk=kkk+20
  9215.     call varsc2(line,kkk,kkkk,klstc,kc1,kc2,kvld)
  9216.     if(kvld.eq.0)goto 3906
  9217. c Update last chharacter seen pointer to pass these variables.
  9218.     if(line(klstc).eq.':')klstc=klstc+1
  9219.     lstchr=klstc
  9220. c Get the values of the variables and store as integers
  9221.     call xvblgt(kr1,kr2,xac)
  9222.     rsm=xac
  9223.     call xvblgt(kc1,kc2,xac)
  9224.     csm=xac
  9225.     goto 3901
  9226. 3906    continue
  9227.     RSM=ICHAR(LINE(LSTCHR))
  9228.     CSM=ICHAR(LINE(LSTCHR+1))
  9229.     LSTCHR=LSTCHR+2
  9230. C FIX UP ASCII OFFSETS, AND MEANWHILE REQUIRE UPPERCASE
  9231. C AND THAT THERE BE 2 AC'S NAMES AFTER THE %.
  9232. C THIS SHOULD BE HANDY FOR COMMAND FILES.
  9233.     RSM=RSM-64
  9234.     CSM=CSM-64
  9235. C NOW RSM, CSM ARE SUBSCRIPTS. PULL OUT VALUES FROM XVBLS
  9236.     IF(RSM.LE.0.OR.RSM.GT.27)GOTO 103
  9237.     IF(CSM.LE.0.OR.CSM.GT.27)GOTO 103
  9238.     DO 3902 IV=1,8
  9239. 3902    XAV1(IV)=AVBLS(IV,RSM)
  9240.     RSM=XAVB
  9241.     DO 3903 IV=1,8
  9242. 3903    XAV1(IV)=AVBLS(IV,CSM)
  9243.     CSM=XAVB
  9244. C LOADS THE 2 AC'S TO THE OFFSETS AND GOES ON...JUST NEEDS THE
  9245. C 2 LETTERS AFTER P#% OR D#%.
  9246.     goto 3901
  9247. 3900    continue
  9248.     CALL GN(LSTCHR,LEND,NUM,LINE)
  9249. C GN GETS THE +- NN NUMBER AND RETURNS VALUE IN NUM.
  9250. C LSTCHR RETURNS AS NEXT CHAR NOT USED.
  9251.     RSM=NUM
  9252. C 35 IS ASCII FOR '#'
  9253. C allow any delimiter between numbers, though we must have # at start
  9254. C  to delimit valid relative coordinates.
  9255. C    IF(ICHAR(LINE(LSTCHR)).NE.35) GOTO 103
  9256. C IF NO SECOND # SEEN, THE FORM IS INVALID SO SAY SO AND EXIT.
  9257.     LSTCHR=MIN0(LSTCHR+1,LEND)
  9258. CC BUMP PAST THE # IF WE SAW IT.
  9259. C now get the second numeric string and bump LSTCHR past it.
  9260.     NUM=0
  9261.     CALL GN(LSTCHR,LEND,NUM,LINE)
  9262.     CSM=NUM
  9263. C NOW HAVE THE NUMBERS ENCODED. NOTE THAT ## IS VALID.
  9264. 3901    CONTINUE
  9265.     IF(LPFG.EQ.2) GOTO 1200
  9266. C IF HERE, LPFG=1 AND WE ARE ON PHYSICAL SHEET.
  9267.     if(Iundr.ne.0)goto 3908
  9268.     ID2=CSM+PCOL
  9269.     ID1=RSM+PROW
  9270.     goto 1201
  9271. 3908    Continue
  9272.     id2=CSM+1
  9273.     id1=RSM
  9274. c Subtract 1 from row to make accumulator row be number zero. This is more
  9275. c symmetrical with other usages in the sheet cell names. I like it better than
  9276. c making cell A1 be col 1 row 2.
  9277. 1201    CONTINUE
  9278. C Add-in for 3d cells
  9279.     kshtf=0
  9280.     If(k3dfg.lt.0)goto 1202
  9281. C 37 is ascii %
  9282.     IF(LINE(LSTCHR).NE.'%') GOTO 1202
  9283. C pass the trailing % character now
  9284.     LSTCHR=MIN0(LSTCHR+1,LEND)
  9285. C limited form of syntax: either a number is to be used
  9286. C or an accumulator.
  9287.     If(ichar(line(lstchr)).gt.64) goto 1203
  9288. C a number.
  9289.     NUM=0
  9290.     CALL GN(LSTCHR,LEND,NUM,LINE)
  9291.     CSM=NUM
  9292.     Goto 1204
  9293. 1203    Continue
  9294. C a (possible) accumulator
  9295.     csm=ichar(line(lstchr))
  9296.     LSTCHR=MIN0(LSTCHR+1,LEND)
  9297.     CSM=CSM-64
  9298. C Csm now is index to accumulator. Validity check it.
  9299.     IF(CSM.LE.0.OR.CSM.GT.27)GOTO 103
  9300.     DO 2902 IV=1,8
  9301. 2902    XAV1(IV)=AVBLS(IV,csm)
  9302. C convert the accumulator value.
  9303.     CSM=XAVB
  9304. 1204    Continue
  9305. C now fix up the col and row returned.
  9306.     id1=id1+(csm*kcdelt)
  9307.     id2=id2+(csm*krdelt)
  9308.     kshtf=csm
  9309. C allow our callers to see what (if any) "page" was flagged.
  9310. C note that zero and no page flagged are treated the same.
  9311. 1202    Continue
  9312. C TO ALLOW REFLECTED VALUES TO WORK, LET ALL NORMAL VALUES BY...
  9313. C    IF(ID1.GT.60.OR.ID1.LE.0)GOTO 103
  9314. C    IF(ID2.GT.301.OR.ID2.LE.0)GOTO 103
  9315.     IVALID=1
  9316. C ALL IS WELL
  9317.     RETURN
  9318. 1200    CONTINUE
  9319. C DISPLAY COLUMN RELATIVE.
  9320.     DLFG=1
  9321. C FLAG WE SAW A D## FORM FOR RECALC
  9322.     DRRW=DROW+RSM
  9323.     DRRW=MAX0(1,DRRW)
  9324.     DRRW=MIN0(20,DRRW)
  9325.     DCCL=DCOL+CSM
  9326. C ENSURE DISPLAY COORDS IN LEGAL BOUNDS
  9327.     DCCL=MAX0(1,DCCL)
  9328.     DCCL=MIN0(75,DCCL)
  9329. C CLAMP TO WITHIN LEGAL DIMENSIONS.
  9330.     ID1=NRDSP(DRRW,DCCL)
  9331.     ID2=NCDSP(DRRW,DCCL)
  9332.     GOTO 1201
  9333. 5000    CONTINUE
  9334.     IF(ASM.NE.0.OR.NSM.NE.0)GOTO 103
  9335. C HANDLE 255,CODE1,CODE2 FORMS
  9336. C FIRST BYTE IS ALWAYS 255
  9337. C 2ND BYTE IS: HI 2 BITS ARE HI 2 BITS OF ID2. LO 6 BITS ARE ID1
  9338. C 3RD BYTE IS: LO 8 BITS OF ID2
  9339.     I1=ICHAR(LINE(LSTCHR+1))
  9340.     I2=IMASK(I1,I192)
  9341. C    L2=L1.AND.L192
  9342. C    L1=L1.AND.L63
  9343.     I1=IMASK(I1,I63)
  9344.     ID1=I1
  9345.     I1=ICHAR(LINE(LSTCHR+2))
  9346. C    L1=L1.AND.L127
  9347.     I1=IMASK(I1,I127)
  9348. C MUST HAVE 128 BIT ON IN LOW BYTE TO AVOID NULLS IN IT.
  9349.     ID2=I2*2+I1
  9350.     LSTCHR=LSTCHR+3
  9351.     GOTO 1201
  9352.     END
  9353. c -h- varsc2.for
  9354. C $DO66
  9355.     SUBROUTINE VARSC2(LINE,IBGN,LEND,LSTCHR,ID1,ID2,IVALID)
  9356.     Include AParms.inc
  9357. C COPYRIGHT (C) 1983, 1984 GLENN AND MARY EVERHART
  9358. C ALL RIGHTS RESERVED
  9359. C
  9360. C VARSC2 - SCAN COMMAND LINE FOR VARIABLE NAMES.
  9361. C    This copy of VARSCN lacks the P#@var1var2 construct and exists to
  9362. C    be called from VARSCN for that construct to parse the var1 and var2
  9363. C    variable names without risk of a recursive call to varscn (which
  9364. C    Fortran generally cannot handle.)
  9365. C
  9366. C    SCANS FOR VARIABLE NAMES OF FORM AAANNN WHERE AAA = LETTERS
  9367. C BETWEEN A AND Z UP TO NON-ALPHA, CORRESPONDING TO ROW, FOLLOWED BY
  9368. C NUMBERS IN THE 0-9 RANGE MAKING A DECIMAL COLUMN NUMBER.
  9369. C
  9370. C THE LETTERS ARE FORMED BY
  9371. C A-Z ALONE GIVE ROW 1-26, COL 1. % IS ROW 27,COL1
  9372. C A1-Z1 GIVE ROW 1-26, COL 2
  9373. C AA1-ZZ1 ARE ROW 27-52, COL 2
  9374.     IMPLICIT InTeGer*4 (A-Z)
  9375. C NOTE COL 1 IS DUMMY. DISPLAY THE SHEET SIDEWAYS SO WE GET USUAL VISUAL
  9376. C ROWS, COLS., AND ACCUMULATORS A-Z,% JUST APPEAR AS A FICTITIOUS ROW 0
  9377. C ON DISPLAY, INSTEAD OF REAL COLUMN 1 HERE.
  9378.     DIMENSION LINE(LEND)
  9379.     CHARACTER*1 LINE
  9380.     InTeGer*4 TYPE(1,1),VLEN(9)
  9381.     REAL*8 XVBLS(1,1)
  9382.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1)
  9383.     REAL*8 XAVB
  9384.     REAL*4 XAV2(2)
  9385.     CHARACTER*1 XAV1(8)
  9386.     EXTERNAL INDX
  9387.     EQUIVALENCE(XAVB,XAV2(1)),(XAVB,XAV1(1))
  9388.     EQUIVALENCE(XVBLS(1,1),VBLS(1,1,1))
  9389.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  9390. C ***<<< KLSTO COMMON START >>>***
  9391.     InTeGer*4 DLFG
  9392. C    COMMON/DLFG/DLFG
  9393.     InTeGer*4 KDRW,KDCL
  9394. C    COMMON/DOT/KDRW,KDCL
  9395.     InTeGer*4 DTRENA
  9396. C    COMMON/DTRCMN/DTRENA
  9397.     REAL*8 EP,PV,FV
  9398.     DIMENSION EP(20)
  9399.     INTEGER*4 KIRR
  9400. C    COMMON/ERNPER/EP,PV,FV,KIRR
  9401.     InTeGer*4 LASTOP
  9402. C    COMMON/ERROR/LASTOP
  9403.     CHARACTER*1 FMTDAT(9,76)
  9404. C    COMMON/FMTBFR/FMTDAT
  9405.     CHARACTER*1 EDNAM(16)
  9406. C    COMMON/EDNAM/EDNAM
  9407.     InTeGer*4 MFID(2),MFMOD(2)
  9408. C    COMMON/FRM/MFID,MFMOD
  9409.     InTeGer*4 JMVFG,JMVOLD
  9410. C    COMMON/FUBAR/JMVFG,JMVOLD
  9411.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  9412.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  9413. C ***<<< KLSTO COMMON END >>>***
  9414. CCC    InTeGer*4 DLFG
  9415. CCC    COMMON/DLFG/DLFG
  9416. C DLFG=1 IF D## FORMS ARE SEEN
  9417.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  9418.     COMMON/D2R/NRDSP,NCDSP
  9419. C NRDSP AND NCDSP ARE REAL ROW, COL OF DISPLAY ROW, COL CELLS. NOTE THAT
  9420. C NOT ALL DISPLAY CELLS ARE ALWAYS ACTUALLY SHOWN; ONLY THOSE THAT FIT
  9421. C ARE SHOWN; THE REST "EXIST" BUT DON'T APPEAR UNLESS ROWS ARE SMALL
  9422. C ENOUGH.
  9423. C
  9424. C THIS PROGRAM ALSO HANDLES CELL SPECS OF FORM
  9425. C P#+nnn#+nnn (or P#-nnn#-mmm) FOR Physical cells relative to our current
  9426. C physical cell on the sheet (clamped at boundaries), or of form
  9427. C D#+nnn#+mmm etc for Display cells relative to our current display
  9428. C location as held in the DROW,DCOL cells in commons.
  9429. C ***<<<< RDD COMMON START >>>***
  9430.     InTeGer*4 RRWACT,RCLACT
  9431. C    COMMON/RCLACT/RRWACT,RCLACT
  9432.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  9433.      1  IDOL7,IDOL8
  9434. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  9435. C     1  IDOL7,IDOL8
  9436.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  9437. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  9438.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  9439. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  9440. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  9441. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  9442.     InTeGer*4 KLVL
  9443. C    COMMON/KLVL/KLVL
  9444.     InTeGer*4 IOLVL,IGOLD
  9445. C    COMMON/IOLVL/IOLVL
  9446. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  9447. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  9448.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  9449.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  9450.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  9451.      3  k3dfg,kcdelt,krdelt,kpag
  9452. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  9453. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  9454. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  9455. C ***<<< RDD COMMON END >>>***
  9456. CCC    InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6
  9457. CCC    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6
  9458. CCC    InTeGer*4 PROW,PCOL
  9459. C ! PHYSICAL ROW, COL BEING HANDLED.
  9460. CCC    InTeGer*4 DROW,DCOL,DCLV,DRWV
  9461.     InTeGer*4 RSM,CSM,AFG,ASM,VCF,CH
  9462. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  9463.     LOGICAL*4 L1,L2
  9464. C    LOGICAL*2 L63,L192,L127
  9465.     InTeGer*4 I1,I2
  9466.     InTeGer*4 I63,I192,I127
  9467.     EQUIVALENCE(I1,L1),(I2,L2)
  9468. C    EQUIVALENCE (I63,L63),(I192,L192),(L127,I127)
  9469.     DATA I63/63/,I192/192/,I127/127/
  9470. C DRWV,DCLV = # OF MAX ROWS, COLS ACTUALLY ON SCREEN NOW. DROW,DCOL
  9471. C ARE ACTUAL "CURSOR" LOCATION.
  9472. C
  9473. C ZERO OUR VARIABLES
  9474.     LPFG=0
  9475. C ! FLAG WE GOT A LOGICAL/PHYSICAL # FORM AND TYPE
  9476.     AFG=0
  9477. C ! FLAG WE SAW AN ALPHA
  9478.     ASM=0
  9479. C ! SUM OF ALPHAS HASHCODED (ACCUMULATOR)
  9480.     NSM=0
  9481. C ! ACCUMULATOR FOR NUMERICS
  9482.     NFG=0
  9483. C ! FLAG WE SAW A NUMERIC
  9484.     RSM=0
  9485. C ! AC FOR ROWS IN # FORMS
  9486.     CSM=0
  9487. C ! AC FOR COLS IN # FORMS
  9488.     ISPC=0
  9489. C ! COUNTER FOR NONSPACES SEEN (USED TO STOP ON TRAILING SPACES)
  9490.     idol1=0
  9491.     idol2=0
  9492.     IF(LINE(IBGN).NE.'%')GOTO 2000
  9493.     ID1=27
  9494.     ID2=1
  9495.     IVALID=1
  9496.     LSTCHR=IBGN+1
  9497. C SPECIAL CASE FOR % = AC #27
  9498.     RETURN
  9499. 2000    CONTINUE
  9500.     DO 1 N=IBGN,LEND
  9501.     VCF=0
  9502.     LSTCHR=N
  9503.     CH=ICHAR(LINE(N))
  9504.     IF (CH.EQ.255)GOTO 5000
  9505. C 5000 DECODES ENCODED FORMS AND RETURNS THEM...
  9506. C
  9507. C IGNORE SPACES AND TABS IF LEADING
  9508.     IF(CH.GT.32)ISPC=ISPC+1
  9509.     IF(CH.GT.0.AND.CH.LE.32.AND.ISPC.EQ.0)GOTO 1
  9510. C SPECIAL CASE TRAILING DOLLAR SIGNS... SKIP AND FLAG
  9511.     IF(CH.NE.36)GOTO 3443
  9512. C 36 IS ASCII FOR $ SIGN
  9513. C SAW A DOLLAR SIGN
  9514.     IF(AFG.EQ.1.AND.NFG.EQ.0)IDOL1=1
  9515.     IF(AFG.EQ.1.AND.NFG.EQ.1)IDOL2=1
  9516. C LEAVES WITH IDOL1 FLAGGED AS 1 IF LETTER PART WAS FOLLOWED BY
  9517. C DOLLAR SIGN, AND IDOL2 FLAGGED IF NUMBER PART WAS FOLLOWED
  9518. C BY DOLLAR. IGNORES ALL OTHER DOLLAR SIGNS.
  9519.     GOTO 1
  9520. 3443    CONTINUE
  9521. C GET CHARACTER VALUE IN.
  9522. C MUST BE UPPERCASE.
  9523.     IF(.NOT.(CH.GE.65.AND.CH.LT.91)) GOTO 100
  9524. C CH IS AN ALPHA, RANGE A-Z
  9525.     VCF=1
  9526. C ! VALID CHAR SEEN
  9527.     AFG=1
  9528. C !SAW THE ALPHA
  9529.     IF(ASM.LT.MRC)ASM=(CH-64)+26*ASM
  9530.     IF(NFG.NE.0)GOTO 103
  9531. C FILTER OUT TOO-LARGE VALUES...
  9532.     IF(ASM.GT.(MRC-MCOls))GOTO 103
  9533. C 60 * 26 IS LIM ABOVE
  9534.     IF(CH.EQ.80)LPFG=1
  9535. C ! FLAG WE GOT PHYS. FORM MAYBE
  9536.     IF(CH.EQ.68)LPFG=2
  9537. C ! FLAG WE GOT DISPLAY FORM MAYBE
  9538. 100    CONTINUE
  9539. C EXPECT # FORMS TO HAVE # JUST AFTER 1ST ALPHA.
  9540. C 35 IS ASCII VALUE OF '#' CHAR.
  9541.     IF(CH.EQ.35)GOTO 1000
  9542. C NEXT TEST NUMERICS
  9543.     IF(.NOT.(CH.GE.48.AND.CH.LE.57))GOTO 101
  9544. C CH IS A NUMERIC, RANGE 0-9
  9545.     VCF=1
  9546. C ! VALID CHAR SEEN
  9547.     NFG=1
  9548. C ! FLAG WE SAW NUMERIC
  9549.     IF(AFG.NE.0)GOTO 102
  9550.     GOTO 103
  9551. 102    CONTINUE
  9552.     IF(NSM.LT.MRC)NSM=(CH-48)+10*NSM
  9553. C FILTER OUT TOO-LARGE VALUES EARLY
  9554. C 301 * 10 IS LIMIT...
  9555.     IF(NSM.GT.(MRC-MCols))GOTO 103
  9556. C ! CONVERT CHARS TO BINARY AS SEEN
  9557. 101    CONTINUE
  9558.     IF(VCF.EQ.0)GOTO 2
  9559. C !END ON ANY INVALID CHARACTER
  9560. 1    CONTINUE
  9561. 2    CONTINUE
  9562.     IF(AFG.EQ.0)GOTO 103
  9563.     GOTO 950
  9564. 103    CONTINUE
  9565. C INVALID ... NUMERIC AND NO PRIOR ALPHA. FLAG BAD NAME AND EXIT.
  9566.     IVALID=0
  9567.     RETURN
  9568. 950    ID1=ASM
  9569.     ID2=1+NSM
  9570. C ! NOTE ID2=1 IF NO NUMERICS SEEN, MORE OTHERWISE.
  9571.     GOTO 1201
  9572. 1000    CONTINUE
  9573. C HERE HANDLE CURRENT-REFERENCED FORMS USING # AS SPECIAL CHARACTER MEANING
  9574. C THE CURRENT POSITION. THESE TYPES OF REFERENCES MAY BE MOVED AROUND THE
  9575. C SHEET WHICH ACCOUNTS FOR THEIR USEFULNESS. SINCE THERE IS A DISPLAY
  9576. C AND PHYSICAL SHEET WHICH ARE MAPPED BY A MAPPING, ALLOW EITHER
  9577. C TO BE REFERENCED. THUS, COMPLEX CALCULATIONS MAY BE DONE BUT LARGELY
  9578. C HIDDEN. THE ACCUMULATORS MAY BE USED AS SCRATCH STORAGE FOR THIS
  9579. C SORT OF THING.
  9580. C SAW THE # SIGN, SO SEE IF THE + OR - N CAN BE DECODED.
  9581. C IF NO P OR D WAS SEEN HOWEVER WE HAVE AN INVALID NAME, SO FLAG IT.
  9582.     IF(LPFG.EQ.0)GOTO 103
  9583. C PASS THE # SIGN PRIOR TO GETTING THE NUMERIC.
  9584.     LSTCHR=LSTCHR+1
  9585.     iundr=0
  9586.     if(line(lstchr).eq.'_')iundr=1
  9587.     if(line(lstchr).ne.'%'.and.iundr.eq.0)goto 3900
  9588. c allow p#%ab form to mean use ac a and b to get offsets from "here"
  9589. c allow P#_ab to be absolute address ref for cells (otherwise like p#%ab)
  9590.     CSM=0
  9591.     RSM=0
  9592. C DEFAULT TO "THIS" CELL
  9593.     LSTCHR=LSTCHR+1
  9594. C PASS THE % SIGN
  9595.     RSM=ICHAR(LINE(LSTCHR))
  9596.     CSM=ICHAR(LINE(LSTCHR+1))
  9597.     LSTCHR=LSTCHR+2
  9598. C FIX UP ASCII OFFSETS, AND MEANWHILE REQUIRE UPPERCASE
  9599. C AND THAT THERE BE 2 AC'S NAMES AFTER THE %.
  9600. C THIS SHOULD BE HANDY FOR COMMAND FILES.
  9601.     RSM=RSM-64
  9602.     CSM=CSM-64
  9603. C NOW RSM, CSM ARE SUBSCRIPTS. PULL OUT VALUES FROM XVBLS
  9604.     IF(RSM.LE.0.OR.RSM.GT.27)GOTO 103
  9605.     IF(CSM.LE.0.OR.CSM.GT.27)GOTO 103
  9606.     DO 3902 IV=1,8
  9607. 3902    XAV1(IV)=AVBLS(IV,RSM)
  9608.     RSM=XAVB
  9609.     DO 3903 IV=1,8
  9610. 3903    XAV1(IV)=AVBLS(IV,CSM)
  9611.     CSM=XAVB
  9612. C LOADS THE 2 AC'S TO THE OFFSETS AND GOES ON...JUST NEEDS THE
  9613. C 2 LETTERS AFTER P#% OR D#%.
  9614.     goto 3901
  9615. 3900    continue
  9616.     CALL GN(LSTCHR,LEND,NUM,LINE)
  9617. C GN GETS THE +- NN NUMBER AND RETURNS VALUE IN NUM.
  9618. C LSTCHR RETURNS AS NEXT CHAR NOT USED.
  9619.     RSM=NUM
  9620. C 35 IS ASCII FOR '#'
  9621. C allow any delimiter between numbers, though we must have # at start
  9622. C  to delimit valid relative coordinates.
  9623. C    IF(ICHAR(LINE(LSTCHR)).NE.35) GOTO 103
  9624. C IF NO SECOND # SEEN, THE FORM IS INVALID SO SAY SO AND EXIT.
  9625.     LSTCHR=MIN0(LSTCHR+1,LEND)
  9626. CC BUMP PAST THE # IF WE SAW IT.
  9627. C now get the second numeric string and bump LSTCHR past it.
  9628.     NUM=0
  9629.     CALL GN(LSTCHR,LEND,NUM,LINE)
  9630.     CSM=NUM
  9631. C NOW HAVE THE NUMBERS ENCODED. NOTE THAT ## IS VALID.
  9632. 3901    CONTINUE
  9633.     IF(LPFG.EQ.2) GOTO 1200
  9634. C IF HERE, LPFG=1 AND WE ARE ON PHYSICAL SHEET.
  9635.     if(Iundr.eq.1)goto 3908
  9636.     ID2=CSM+PCOL
  9637.     ID1=RSM+PROW
  9638.     goto 1201
  9639. 3908    Continue
  9640.     id2=CSM
  9641.     id1=RSM
  9642. 1201    CONTINUE
  9643. C TO ALLOW REFLECTED VALUES TO WORK, LET ALL NORMAL VALUES BY...
  9644. C    IF(ID1.GT.60.OR.ID1.LE.0)GOTO 103
  9645. C    IF(ID2.GT.301.OR.ID2.LE.0)GOTO 103
  9646.     IVALID=1
  9647. C ALL IS WELL
  9648.     RETURN
  9649. 1200    CONTINUE
  9650. C DISPLAY COLUMN RELATIVE.
  9651.     DLFG=1
  9652. C FLAG WE SAW A D## FORM FOR RECALC
  9653.     DRRW=DROW+RSM
  9654.     DRRW=MAX0(1,DRRW)
  9655.     DRRW=MIN0(20,DRRW)
  9656.     DCCL=DCOL+CSM
  9657. C ENSURE DISPLAY COORDS IN LEGAL BOUNDS
  9658.     DCCL=MAX0(1,DCCL)
  9659.     DCCL=MIN0(75,DCCL)
  9660. C CLAMP TO WITHIN LEGAL DIMENSIONS.
  9661.     ID1=NRDSP(DRRW,DCCL)
  9662.     ID2=NCDSP(DRRW,DCCL)
  9663.     GOTO 1201
  9664. 5000    CONTINUE
  9665.     IF(ASM.NE.0.OR.NSM.NE.0)GOTO 103
  9666. C HANDLE 255,CODE1,CODE2 FORMS
  9667. C FIRST BYTE IS ALWAYS 255
  9668. C 2ND BYTE IS: HI 2 BITS ARE HI 2 BITS OF ID2. LO 6 BITS ARE ID1
  9669. C 3RD BYTE IS: LO 8 BITS OF ID2
  9670.     I1=ICHAR(LINE(LSTCHR+1))
  9671.     I2=IMASK(I1,I192)
  9672. C    L2=L1.AND.L192
  9673. C    L1=L1.AND.L63
  9674.     I1=IMASK(I1,I63)
  9675.     ID1=I1
  9676.     I1=ICHAR(LINE(LSTCHR+2))
  9677. C    L1=L1.AND.L127
  9678.     I1=IMASK(I1,I127)
  9679. C MUST HAVE 128 BIT ON IN LOW BYTE TO AVOID NULLS IN IT.
  9680.     ID2=I2*2+I1
  9681.     LSTCHR=LSTCHR+3
  9682.     GOTO 1201
  9683.     END
  9684. c -h- vvary.for    Fri Aug 22 13:37:17 1986    
  9685. C $DO66
  9686. C VARY CONTROL ROUTINE
  9687. C NOTE: THIS ROUTINE RELIES UPON HAVING ITS DATA AREAS REMAIN INTACT
  9688. C ACROSS CALLS. IT MUST NOT BE IN AN OVERLAY SEGMENT OR THAT WILL FAIL
  9689. C AND IT WILL NOT WORK. SPECIFICALLY IT EXPECTS THE AC ARRAY TO BE
  9690. C SET CORRECTLY.
  9691.     SUBROUTINE VVARY(LINE,RETCD,K)
  9692.     CHARACTER*1 LINE(80)
  9693.     INTEGER RETCD
  9694.     CHARACTER*1 AVBLS(20,27),WRK(128),VBLS(8,1,1)
  9695.     InTeGer*4 TYPE(1,1),VLEN(9)
  9696.     REAL*8 XAC,XVBLS(1,1)
  9697.     EQUIVALENCE(XAC,AVBLS(1,27))
  9698.     INTEGER*4 JVBLS(2,1,1)
  9699.     EQUIVALENCE(VBLS(1,1,1),JVBLS(1,1,1))
  9700.     EQUIVALENCE(VBLS(1,1,1),XVBLS(1,1))
  9701.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  9702. C LOOP CONTROL FOR VARY FUNCTION. SET ZERO IN SPREDSHT AND
  9703. C MUST BE SET POSITIVE HERE IF WE NEED ITERATIONS.
  9704. C (IMPLEMENT FOR VAX ONLY)
  9705. C ***<<< XVXTCD COMMON START >>>***
  9706.     CHARACTER*1 OARRY(100)
  9707.     InTeGer*4 OSWIT,OCNTR
  9708. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  9709. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  9710. C    InTeGer*4 IPS1,IPS2,MODFLG
  9711.     InTeGer*4 IC1POS,IC2POS,MODFLG
  9712. CCC    COMMON/ICPOS/IC1POS,IC2POS,MODFLG
  9713. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  9714.        InTeGer*4 XTCFG,IPSET,XTNCNT
  9715.        CHARACTER*1 XTNCMD(80)
  9716. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  9717. C VARY FLAG ITERATION COUNT
  9718.     INTEGER KALKIT
  9719. C    COMMON/VARYIT/KALKIT
  9720.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  9721.     InTeGer*4 RCMODE,IRCE1,IRCE2
  9722. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  9723. C     1  IRCE2
  9724. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  9725. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  9726. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  9727. C RCFGX ON.
  9728. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  9729. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  9730. C  AND VM INHIBITS. (SETS TO 1).
  9731.     INTEGER*4 FH
  9732. C FILE HANDLE FOR CONSOLE I/O (RAW)
  9733. C    COMMON/CONSFH/FH
  9734.     CHARACTER*1 ARGSTR(52,4)
  9735. C    COMMON/ARGSTR/ARGSTR
  9736.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IC1POS,IC2POS,MODFLG,
  9737.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  9738.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  9739.      3  IRCE2,FH,ARGSTR
  9740. C ***<<< XVXTCD COMMON END >>>***
  9741. CCC    INTEGER KALKIT
  9742. CCC    COMMON/VARYIT/KALKIT
  9743.     EXTERNAL SIGN
  9744.     INTEGER LPUT,LGET
  9745.     REAL*8 SIGN
  9746.     CHARACTER*1 LAC(8)
  9747.     REAL*8 XVAC,VW
  9748.     EQUIVALENCE(LAC(1),XVAC)
  9749.     REAL *8 AC(26)
  9750.     REAL*8 DERIV(8)
  9751.     REAL*8 DEL(8)
  9752.     REAL*8 OLDVV,OLDX,OLDA
  9753.     INTEGER ACV(8)
  9754.     INTEGER CAC
  9755.     INTEGER CCNT(8)
  9756. C UNCOMMENT THIS COMMON DECLARATION AND MOVE DATA STMTS INTO BLOCK
  9757. C IN ORDER TO OVERLAY THIS...
  9758.     COMMON/VRYDAT/AC,DERIV,DEL,CAC,CCNT,OLDVV,OLDX,OLDA,ACV
  9759. C
  9760. C ACV POINTS TO AC'S VARYING
  9761. C CAC = CURRENT INDEX INTO ACV TO FIND AC BEING VARIED
  9762. C AC IS LAST SET OF ACCUMULATORS SEEN
  9763. C IF ACV ENTRY IS 0, MEANS NO AC TO VARY THERE.
  9764.     INTEGER LW,LX,LI
  9765. C ! LOGICAL W,X,I AC'S
  9766.     INTEGER LA
  9767. C ! LOGICAL A AC
  9768. C
  9769. C    DATA DERIV/8*1./,DEL/8*0./
  9770. C    DATA CAC/1/,CCNT/8*0/
  9771. C    DATA ACV/8*0/
  9772. C    DATA OLDVV/1./
  9773. C
  9774. C PARSE ARGUMENTS FIRST
  9775. C FIRST 2 ARGS ARE X AND A AC'S (OR GENERAL CELLS)
  9776. C DEFAULT NO REDOING THIS...
  9777.     KALKIT=0
  9778.     IBGN=K+5
  9779.     LEND=IBGN+20
  9780.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,LX,ID2A,IVALID)
  9781.     IF (IVALID.EQ.0)GOTO 9900
  9782.     IF(LINE(LSTCHR).NE.',')GOTO 9900
  9783.     IBGN=LSTCHR+1
  9784.     LEND=IBGN+20
  9785.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,LA,ID2B,IVALID)
  9786.     IF (IVALID.EQ.0)GOTO 9900
  9787.     IF(LINE(LSTCHR).NE.',')GOTO 9900
  9788.     IBGN=LSTCHR+1
  9789.     LEND=IBGN+20
  9790.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,LW,ID3B,IVALID)
  9791.     IF (IVALID.EQ.0)GOTO 9900
  9792.     IF(LINE(LSTCHR).NE.',')GOTO 9900
  9793.     IF(ID3B.NE.1)GOTO 9900
  9794.     IBGN=LSTCHR+1
  9795.     LEND=IBGN+20
  9796.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,LI,ID3B,IVALID)
  9797.     IF (IVALID.EQ.0)GOTO 9900
  9798.     IF(LINE(LSTCHR).NE.',')GOTO 9900
  9799.     IF(ID3B.NE.1)GOTO 9900
  9800. C    IBGN=LSTCHR+1
  9801. C    LEND=IBGN+20
  9802. C LOOP OVER VALUES TO VARY NOW
  9803.     DO 99 N=1,8
  9804. 99    ACV(N)=0.
  9805.     DO 100 N=1,8
  9806. C ALLOW UP TO 8 DIMENSIONS VARIATION
  9807.     IBGN=LSTCHR+1
  9808.     LEND=IBGN+20
  9809.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ACV(N),ID3B,IVALID)
  9810.     IF (IVALID.EQ.0)GOTO 9900
  9811.     IF(LINE(LSTCHR).NE.';')GOTO 110
  9812.     IF(ID3B.NE.1)GOTO 9900
  9813.     IBGN=LSTCHR+1
  9814.     LEND=IBGN+20
  9815. 100    CONTINUE
  9816. 110    CONTINUE
  9817. C NOW HAVE ALL AC POINTERS SET UP.
  9818. C IF I IS NOW 0 OR NEGATIVE (ITER COUNT), REINITIALIZE.
  9819.     ASSIGN 111 TO LGET
  9820.     LLL=LI
  9821.     GOTO 500
  9822. 111    CONTINUE
  9823.     IF(XVAC.GT.0.)GOTO 112
  9824. C INITIALIZE COUNTS
  9825.     LLL=LW
  9826. C GET VALUE OF W FRACTION
  9827.     ASSIGN 114 TO LGET
  9828.     GOTO 500
  9829. 114    CONTINUE
  9830.     VW=XVAC
  9831.     OLDVV=1.
  9832.     DO 113 N=1,8
  9833.     CCNT(N)=0
  9834.     DERIV(N)=1.
  9835.     DEL(N)=VW
  9836. 113    CONTINUE
  9837.     CAC=1
  9838. C COPY CURRENT AC'S INTO SAVED ONES NOW.
  9839.     DO 117 N=1,26
  9840.     LLL=N
  9841.     ASSIGN 118 TO LGET
  9842.     GOTO 500
  9843. 118    AC(N)=XVAC
  9844. 117    CONTINUE
  9845. C AFTER THE INIT, JUST RETURN SINCE WE DON'T WANT TO TRY ANY ITERATIONS
  9846. C WHEN ITER COUNT EXPIRES.
  9847.     KALKIT=0
  9848.     RETURN
  9849. C HERE WHEN ITER COUNT IS POSITIVE.
  9850. 112    CONTINUE
  9851.     XVAC=XVAC-1.
  9852. C UPDATE ITERATION COUNT NOW...
  9853.     KALKIT=XVAC
  9854.     ASSIGN 120 TO LPUT
  9855.     GOTO 600
  9856. 120    CONTINUE
  9857. C
  9858. C NOW PROCEED WITH VARIATIONS...
  9859.     IF(CAC.LT.1.OR.CAC.GT.8)CAC=1
  9860.     IF(CCNT(CAC).GE.1)GOTO 200
  9861. C CCNT WAS 0 SO WE DIDN'T GET OUR PARTIAL YET. VARY THE
  9862. C AC WE'RE LOOKING AT (CAC = CURRENT AC) AND USE NEW VALUE OF
  9863. C (X-A) FOR A NUMERICAL DERIVATIVE RESULT AFTER A RECALC OF SCREEN...
  9864.     CCNT(CAC)=1
  9865. C JUST STARTED THIS AC SO VARY BY THE APPROPRIATE DELTA AND
  9866. C EXIT, ALLOWING PARTIAL TO BE COMPUTED NEXT TIME.
  9867.     LLL=LW
  9868.     ASSIGN 400 TO LGET
  9869.     GOTO 500
  9870. 400    CONTINUE
  9871. C GET W ACC. VALUE
  9872.     VW=XVAC
  9873.     IF(VW.EQ.0.)VW=.5
  9874. C GET CURRENT AC, FIND HOW TO UPDATE IT.
  9875.     LLL=ACV(CAC)
  9876.     IF(LLL.LE.0)GOTO 9900
  9877.     ASSIGN 121 TO LGET
  9878.     GOTO 500
  9879. 121    CONTINUE
  9880. C NOW XVAC HAS CURRENT AC FOR THE ONE WE'RE VARYING
  9881. C ADD DEL TO IT AND GET NEW ONE...
  9882. C SAVE OLD X AC VALUE FOR NEXT ITERATION.
  9883. C NOTE LLL IS STILL SET AT CURRENTLY VARYING AC
  9884. C SAVE CURRENT (UNVARIED) VALUE TOO FOR NEXT TIME AROUND.
  9885.     OLDVV=XVAC
  9886.     IF(OLDVV.EQ.0.)OLDVV=1.
  9887.     IF(DEL(CAC).EQ.0.)DEL(CAC)=VW
  9888.     XVAC=XVAC*(1.+DEL(CAC))
  9889. C NOW ALL SET... JUST SAVE CURRENT AC'S AND CURRENT X,A
  9890. C SO WE CAN GET DIFFERENCE NEXT TIME AROUND.
  9891. C    AC(ACV(CAC))=XVAC
  9892. C STORE XVAC INTO REAL ACCUMULATORS TOO, SO IT'LL WORK
  9893. C WHEN ALL AC'S ARE RELOADED BELOW.
  9894.     ASSIGN 412 TO LPUT
  9895.     GOTO 600
  9896. 412    CONTINUE
  9897. C AT 1000, RELOAD AC ARRAY FROM REAL AC'S... BUT GET OUR MODIFIED
  9898. C ONE WE JUST STORED TOO.
  9899.     GOTO 1000
  9900. 200    CONTINUE
  9901. C COUNT HERE IS 1 SO WE ALREADY HAVE INFO NOW FOR OUR PARITAL
  9902. C DERIVATIVE. COMPUTE IT AND VARY THE SELECTED AC USING IT
  9903. C THEN STORE IT AND RESET CCNT(CAC) TO 0
  9904.     CCNT(CAC)=0
  9905. C MUST GET NEW X AND A VALUES NOW.
  9906.     CALL XVBLGT(LX,ID2A,XVAC)
  9907. C    XVAC=XVBLS(LX,ID2A)
  9908.     IF(ID2A.NE.1)GOTO 201
  9909.     LLL=LX
  9910.     ASSIGN 201 TO LGET
  9911. C EXTRACT CURRENT X FROM AVBLS
  9912.     GOTO 500
  9913. 201    CONTINUE
  9914.     XCURR=XVAC
  9915.     CALL XVBLGT(LA,ID2B,XVAC)
  9916. C    XVAC=XVBLS(1,1)
  9917.     IF(ID2B.NE.1)GOTO 202
  9918.     LLL=LA
  9919.     ASSIGN 202 TO LGET
  9920.     GOTO 500
  9921. 202    CONTINUE
  9922.     ACURR=XVAC
  9923. C NOW WE HAVE ENOUGH TO COMPUTE PARTIAL DERIVATIVE WE NEED.
  9924.     IF(ACV(CAC).LE.0)GOTO 9900
  9925.     IF(OLDVV.EQ.0.)OLDVV=AC(ACV(CAC))
  9926.     IF(OLDVV.EQ.0.)OLDVV=1.
  9927.     DERIV(CAC)=((XCURR-ACURR)-(OLDX-OLDA))/(DEL(CAC)*OLDVV)
  9928. C NEGATIVE FEEDBACK: IF GOING POSITIVE, MAKE IT NEGATIVE...
  9929. C THIS IS NOT AN ANALYTICAL PROCEDURE ... JUST STEPS IN RIGHT DIRECTION
  9930. C BY APPROPRIATE AMOUNT AND CONTINUES...
  9931. C CLAMP VARIATION TO INITIAL PERCENTAGE IN W ACCUMULATOR
  9932.     LLL=LW
  9933. C OBTAIN VALUE OF W VARIATION NOW...IN CASE USER SETS IT UP TO VARY
  9934.     ASSIGN 203 TO LGET
  9935.     GOTO 500
  9936. 203    CONTINUE
  9937.     VW=XVAC
  9938. C
  9939. C TO ATTEMPT TO GET TO THE ZERO OF (X-A), WE REALLY NEED TO
  9940. C DIVIDE BY THE DERIVATIVE. HOWEVER, IN CASES WHERE THE FUNCTION
  9941. C IS NEAR ITS LOCAL MINIMUM AND SLOWLY VARYING, WE REALLY DON'T WANT
  9942. C TO STEP FAR AWAY (IT MAY NEVER REACH THE ZERO). THEREFORE, TEST
  9943. C TO SEE IF THE DERIVATIVE IS LARGE AND ALLOW DIVISION WHERE IT IS
  9944. C OVER A SOMEWHAT ARBITRARY THRESHOLD (USED 1.0 BELOW), BUT
  9945. C MULTIPLY BY DERIVATIVE OTHERWISE, SO THAT AS THE FUNCTION APPROACHES
  9946. C ZERO SLOPE, THE STEPS GET FINER TO GET INTO THE LOCAL MINIMUM (IF ANY).
  9947. C
  9948. C FORCE NONZERO VARIATION JUST SO WE DON'T GET STUCK.
  9949.     IF(DERIV(CAC).EQ.0.)DERIV(CAC)=.01
  9950.     IF(DABS(DERIV(CAC)).GT.1.)GOTO 405
  9951.     DEL(CAC)=-(OLDX-OLDA)*VW*DERIV(CAC)
  9952.     GOTO 406
  9953. 405    CONTINUE
  9954.     DEL(CAC)=-(OLDX-OLDA)*VW/DERIV(CAC)
  9955. 406    CONTINUE
  9956. C VERY IMPORTANT TO CLAMP SIZE OF STEPS HERE SO WE DON'T WILDLY DIVERGE
  9957. C IN EARLY GOING. SMALL STEPS TAKE LONGER BUT GET TO MINIMA; LARGER ONES
  9958. C WHERE WE DON'T KNOW FUNCTION SHAPE CAN BE DISASTERS.
  9959.     IF(DABS(DEL(CAC)).GT.VW)DEL(CAC)=VW*SIGN(DEL(CAC))
  9960. C NOW RESTORE AC'S TO OLD ONES AND VARY CURRENT ONE BY
  9961. C THE NEW DELTA.
  9962.     IF(ACV(CAC).LE.0)GOTO 9900
  9963. C NEXT LINE MAKES ADJUSTMENT NEEDED TO OUR VARYING AC.
  9964.     AC(ACV(CAC))=OLDVV*(1.+DEL(CAC))
  9965. C NOW COPY SAVED OLD AC'S ONTO NEW ONES SO WE START WITH AC'S ALL AS THEY
  9966. C WERE IN FIRST STEP SO WE VARY FROM INITIAL X, NOT FROM FIRST VARIED X
  9967. C LOCATION...
  9968.     DO 204 N=1,26
  9969.     XVAC=AC(N)
  9970.     LLL=N
  9971.     ASSIGN 205 TO LPUT
  9972.     GOTO 600
  9973. 205    CONTINUE
  9974. 204    CONTINUE
  9975. C MOVE ON TO THE NEXT CAC VALUE
  9976.     CAC=CAC+1
  9977.     IF(ACV(CAC).LE.0.OR.CAC.GT.8)CAC=1
  9978. 1000    CONTINUE
  9979. C SAVE OLD AC'S NOW FOR NEXT TIME
  9980.     DO 1100 N=1,26
  9981.     LLL=N
  9982.     ASSIGN 1101 TO LGET
  9983.     GOTO 500
  9984. 1101    AC(N)=XVAC
  9985. 1100    CONTINUE
  9986. C REMEMBER OLD X AND A VALUES SINCE WE LOOK FOR X=A AS
  9987. C A SEARCH CONDITION. WE MUST ASSUME THAT SOME SORT OF
  9988. C VARIATION OF ACCUMULATORS GIVEN WILL ALLOW US TO SATISFY
  9989. C THE EQUATION (X-A)=0.
  9990.     OLDX=AC(LX)
  9991.     IF(ID2A.NE.1)CALL XVBLGT(LX,ID2A,OLDX)
  9992. C    IF(ID2A.NE.1)OLDX=XVBLS(LX,ID2A)
  9993.     OLDA=AC(LA)
  9994.     IF(ID2B.NE.1)CALL XVBLGT(LA,ID2B,OLDA)
  9995. C    IF(ID2B.NE.1)OLDA=XVBLS(LA,ID2B)
  9996.     RETURN
  9997. 9900    CONTINUE
  9998.     RETCD=3
  9999.     RETURN
  10000. C PROC TO LOAD XVAC WITH VBLS(LLL)
  10001. 500    CONTINUE
  10002.     DO 501 KKKKN=1,8
  10003. 501    LAC(KKKKN)=AVBLS(KKKKN,LLL)
  10004.     GOTO LGET,(111,114,118,400,121,201,202,203,1101)
  10005. C PROC TO STORE XVAC INTO VBLS(LLL)
  10006. 600    CONTINUE
  10007.     DO 601 KKKKN=1,8
  10008. 601    AVBLS(KKKKN,LLL)=LAC(KKKKN)
  10009.     GOTO LPUT,(120,412,205)
  10010.     END
  10011. c -h- xqtcmd.for    Fri Aug 22 13:45:23 1986    
  10012. C $DO66
  10013.     SUBROUTINE XQTCMD(ICODE)
  10014. C COPYRIGHT (C) 1983-1990 GLENN AND MARY EVERHART
  10015. c All Rights Reserved
  10016.     Include AParms.inc
  10017. C NOTE: THROUGHOUT, ROWS ARE ACTUALLY DOWN, COLUMNS ACROSS ON
  10018. C SCREEN. ROW 0 IN DISPLAY IS THE 27 ACCUMULATORS A-Z AND %, WITH
  10019. C % BEING THE LAST-COMPUTED VALUE FROM THE CALC PROGRAM, WHICH
  10020. C KNOWS HOW TO ACCESS THE DATA BUT IS JUST PASSED COMMAND STRINGS
  10021. C FROM THE DISK BASED FILE HERE.
  10022.     CHARACTER*1 FORM,FVLD,CMDLIN(132),CL127(127)
  10023. C ALLOCATE EXTRA SLOP SPACE AFTER CMDLIN
  10024.     CHARACTER*1 CLWW(136)
  10025.     EQUIVALENCE(CLWW(1),CMDLIN(1))
  10026.     CHARACTER*127 CMDLNA
  10027.     EQUIVALENCE(CMDLIN(1),CL127(1),CMDLNA(1:1))
  10028. C    EQUIVALENCE(CMDLNA,CMDLIN(1))
  10029.     CHARACTER*127 WRKCHR,FORMCH,fwt
  10030. C    equivalence(fwt(1:1),formch(1:1))
  10031.     CHARACTER*1 LET1,LET2,FORM2(128),NMSH(80)
  10032.     CHARACTER*1 WRKCHA(132),WRK127(127)
  10033.     EQUIVALENCE(WRKCHA(1),WRKCHR(1:1),WRK127(1),FORM2(1))
  10034. C    EQUIVALENCE(FORM2(1),WRK127(1))
  10035. C ***<<<< RDD COMMON START >>>***
  10036.     InTeGer*4 RRWACT,RCLACT
  10037. C    COMMON/RCLACT/RRWACT,RCLACT
  10038.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  10039.      1  IDOL7,IDOL8
  10040. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  10041. C     1  IDOL7,IDOL8
  10042.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  10043. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  10044.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  10045. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  10046. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  10047. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  10048. c    InTeGer*4 KLVL
  10049. C    COMMON/KLVL/KLVL
  10050.     InTeGer*4 KLVL,k3dfg,kcdelt,krdelt,kpag
  10051.     InTeGer*4 IOLVL,IGOLD
  10052. C    COMMON/IOLVL/IOLVL
  10053. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  10054. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  10055.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  10056.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  10057.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  10058.      3  k3dfg,kcdelt,krdelt,kpag
  10059. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  10060. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  10061. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  10062. c     3  k3dfg,kcdelt,krdelt,kpag
  10063. C ***<<< RDD COMMON END >>>***
  10064. CCC    InTeGer*4 RRWACT,RCLACT
  10065. CCC    COMMON/RCLACT/RRWACT,RCLACT
  10066.     INTEGER*4 VNLT
  10067.     EXTERNAL INDX
  10068. c    EQUIVALENCE(FORM2(1),WRKCHR)
  10069.     COMMON/NMSH/NMSH
  10070.     REAL*8 XVBLS(1,1)
  10071.     INTEGER KPYBAK
  10072. CCC    Integer*4 FH
  10073. CCC    Common/CONSFH/FH
  10074. C ***<<< KLSTO COMMON START >>>***
  10075.     InTeGer*4 DLFG
  10076. C    COMMON/DLFG/DLFG
  10077.     InTeGer*4 KDRW,KDCL
  10078. C    COMMON/DOT/KDRW,KDCL
  10079.     InTeGer*4 DTRENA
  10080. C    COMMON/DTRCMN/DTRENA
  10081.     REAL*8 EP,PV,FV
  10082.     DIMENSION EP(20)
  10083.     INTEGER*4 KIRR
  10084. C    COMMON/ERNPER/EP,PV,FV,KIRR
  10085.     InTeGer*4 LASTOP
  10086. C    COMMON/ERROR/LASTOP
  10087.     CHARACTER*1 FMTDAT(9,76)
  10088. C    COMMON/FMTBFR/FMTDAT
  10089.     CHARACTER*1 EDNAM(16)
  10090. C    COMMON/EDNAM/EDNAM
  10091.     InTeGer*4 MFID(2),MFMOD(2)
  10092. C    COMMON/FRM/MFID,MFMOD
  10093.     InTeGer*4 JMVFG,JMVOLD
  10094. C    COMMON/FUBAR/JMVFG,JMVOLD
  10095.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  10096.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  10097. C ***<<< KLSTO COMMON END >>>***
  10098. CCC    InTeGer*4 JMVFG,JMVOLD
  10099.     INTEGER*4 JVBLS(2,1,1)
  10100. CCC    COMMON/IOLVL/IOLVL
  10101. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  10102. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  10103. C PUT JMVFG INTO A PSECT BY ITSELF SO IT WILL SURVIVE OVERLAYS.
  10104. CCC    COMMON/FUBAR/JMVFG,JMVOLD
  10105.     DIMENSION FORM(128),FVLD(1,1)
  10106.     CHARACTER*1 DFE,FVWRK,FVWRK2,FRM127(127)
  10107.     EQUIVALENCE(FORM(1),FORMCH(1:1),FRM127(1))
  10108. C    EQUIVALENCE(FORM(1),FRM127(1)),(FRM127(1),FORMCH)
  10109.     DIMENSION DFE(14)
  10110.     CHARACTER*14 CDFE
  10111.     EQUIVALENCE(CDFE(1:1),DFE(1))
  10112. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  10113. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  10114. C SO INITIALLY IGNORE.
  10115. C FVLD=2 = CONST NUMERIC ONLY, COMPUTED. =3, CONST, NEEDS CALC.
  10116. C
  10117. C ROUTINE IN2AS COMPUTES ASCII CHARACTER NAMES OF SUBSCRIPTS IN1,IN2
  10118. C SO DISPLAY CAN HAVE THEM. IT MUST BE THE INVERSE OF VARSCN.
  10119. CCC    InTeGer*4 IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6,
  10120. CCC     1  IDOL7,IDOL8
  10121.  
  10122. CCC    COMMON/DOLLR/IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6,
  10123. CCC     1  IDOL7,IDOL8
  10124. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  10125. CCC    InTeGer*4 LLCMD,LLDSP
  10126. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  10127.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  10128.     COMMON/D2R/NRDSP,NCDSP
  10129.     InTeGer*4 ILNFG,ILNCT,RCF
  10130. C ***<<< NULETC COMMON START >>>***
  10131.     InTeGer*4 ICREF,IRREF
  10132. C    COMMON/MIRROR/ICREF,IRREF
  10133.     InTeGer*4 MODPUB,LIMODE
  10134. C    COMMON/MODPUB/MODPUB,LIMODE
  10135.     InTeGer*4 KLKC,KLKR
  10136.     REAL*8 AACP,AACQ
  10137. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  10138.     InTeGer*4 NCEL,NXINI
  10139. C    COMMON/NCEL/NCEL,NXINI
  10140.     CHARACTER*1 NAMARY(20,301)
  10141. C    COMMON/NMNMNM/NAMARY
  10142.     InTeGer*4 NULAST,LFVD
  10143. C    COMMON/NULXXX/NULAST,LFVD
  10144.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  10145.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  10146. C ***<<< NULETC COMMON END >>>***
  10147. CCC    COMMON/NCEL/NCEL,NXINI
  10148.     CHARACTER*1 ILINE(106)
  10149.     COMMON/ILN/ILNFG,ILNCT,ILINE
  10150. C ***<<< XVXTCD COMMON START >>>***
  10151.     CHARACTER*1 OARRY(100)
  10152.     InTeGer*4 OSWIT,OCNTR
  10153. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  10154. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  10155. C    InTeGer*4 IPS1,IPS2,MODFLG
  10156.     InTeGer*4 IC1POS,IC2POS,MODFLG
  10157. CCC    COMMON/ICPOS/IC1POS,IC2POS,MODFLG
  10158. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  10159.        InTeGer*4 XTCFG,IPSET,XTNCNT
  10160.        CHARACTER*1 XTNCMD(80)
  10161. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  10162. C VARY FLAG ITERATION COUNT
  10163.     INTEGER KALKIT
  10164. C    COMMON/VARYIT/KALKIT
  10165.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  10166.     InTeGer*4 RCMODE,IRCE1,IRCE2
  10167. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  10168. C     1  IRCE2
  10169. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  10170. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  10171. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  10172. C RCFGX ON.
  10173. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  10174. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  10175. C  AND VM INHIBITS. (SETS TO 1).
  10176.     INTEGER*4 FH
  10177. C FILE HANDLE FOR CONSOLE I/O (RAW)
  10178. C    COMMON/CONSFH/FH
  10179.     CHARACTER*1 ARGSTR(52,4)
  10180. C    COMMON/ARGSTR/ARGSTR
  10181.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IC1POS,IC2POS,MODFLG,
  10182.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  10183.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  10184.      3  IRCE2,FH,ARGSTR
  10185. C ***<<< XVXTCD COMMON END >>>***
  10186. CCC    InTeGer*4 IC1POS,IC2POS,MODFLG
  10187. CCC    COMMON/ICPOS/IC1POS,IC2POS,MODFLG
  10188. CCC    CHARACTER*1 OARRY(100)
  10189. CCC    InTeGer*4 OSWIT,OCNTR
  10190. CCC    COMMON/OAR/OSWIT,OCNTR,OARRY
  10191. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  10192.     InTeGer*4 TYPE(1,1),VLEN(9)
  10193.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1)
  10194.     CHARACTER*1 FVLDTP
  10195.     REAL*8 XAC,ZAC
  10196.     EQUIVALENCE(XAC,AVBLS(1,27)),(ZAC,AVBLS(1,26))
  10197.     REAL*8 XXAC,XYAC
  10198.     EQUIVALENCE(XXAC,AVBLS(1,24)),(XYAC,AVBLS(1,25))
  10199. CCC    InTeGer*4 NULAST,LFVD
  10200. CCC    COMMON/NULXXX/NULAST,LFVD
  10201. CCC    CHARACTER*1 ARGSTR(52,4)
  10202. CCC    COMMON/ARGSTR/ARGSTR
  10203. C    EQUIVALENCE(ARGSTR(1,1),VBLS(1,1,1))
  10204. C USE VBLS ENTRIES THAT WOULD CORRESPOND TO THE UNUSED SPACE
  10205. C IN VBLS ARRAY FOR ACCUMULATORS A-Z TO HOLD UP TO 4 ARGUMENTS
  10206. C FROM A COMMAND < WHICH READS IN SPACE-DELIMITED ARGUMENTS.
  10207. C THIS WILL ALLOW INTERACTIVE ENTRY OF DATA AND AUTO
  10208. C SUBSTITUTION OF ARGUMENTS VIA THE EDit COMMAND.
  10209.     EQUIVALENCE(XVBLS(1,1),VBLS(1,1,1))
  10210.     EQUIVALENCE(JVBLS(1,1,1),XVBLS(1,1))
  10211.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  10212. CCC    COMMON/KLVL/KLVL
  10213.     CHARACTER*1 DEFVB(12)
  10214. CCC    InTeGer*4 MODPUB,LIMODE
  10215. CCC    COMMON/MODPUB/MODPUB,LIMODE
  10216.     COMMON/DEFVBX/DEFVB
  10217. CCC    InTeGer*4 FORMFG,RCFGX,PZAP,RCONE,RCMODE,
  10218. CCC     1  IRCE1,IRCE2
  10219. CCC    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,
  10220. CCC     1  IRCE1,IRCE2
  10221. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  10222. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  10223. C  AND VM INHIBITS. (SETS TO 1).
  10224. C
  10225. C DISPLAY ARRAY WILL KEEP A COPY OF VARIABLES DISPLAYED AND FORMATS
  10226. C USED LOCALLY WHICH DISPLAY ROUTINE CAN USE TO SEE WHAT ACTUALLY
  10227. C NEEDS TO BE REFRESHED ON SCREEN. DRWV AND DCLV ARE COLS, ROWS OF
  10228. C DISPLAY ACTUALLY USED FOR SCREEN.
  10229.     InTeGer*4 CWIDS(20)
  10230. C CWIDS IS WIDTHS IN CHARACTERS OF COLUMNS ON DISPLAY. NOTE THAT BECAUSE
  10231. C OF PECULIAR INVERSION WHICH I AM TOO LAZY TO CORRECT IT IS DIMENSIONED
  10232. C AS 20 NOT 75.
  10233.     REAL*8 DVS(20,75)
  10234.     INTEGER*4 LDVS(2,20,75)
  10235.     EQUIVALENCE(LDVS(1,1,1),DVS(1,1))
  10236.     COMMON /FVLDC/FVLD
  10237. C    CHARACTER*1 DFMTS(10,20,75)
  10238. C 10 CHARACTERS PER ENTRY.
  10239.     COMMON/DSPCMN/DVS,CWIDS
  10240. C THISRW,THISCL = CURRENT DISPLAYED LOCS.
  10241.     InTeGer*4 THISRW,THISCL
  10242. C    CHARACTER*1 IBITMP(2258)
  10243. C    COMMON/INITD/IBITMP
  10244. C FOLLOWING COMMON IS TO CONTROL "EXTERNAL" CALL OF XQTCMD
  10245. C TO ALLOW USE FROM INSIDE CELLS.
  10246. CCC    CHARACTER*1 XTNCMD(80)
  10247. CCC    InTeGer*4 XTCFG,XTNCNT,IPSET
  10248. CCC    COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  10249.     CHARACTER*1 blanks
  10250.     dimension blanks(30)
  10251.     data blanks/30*' '/
  10252. C
  10253.     OSWIT=2
  10254. C ISSUE A PROMPT FOR COMMAND AND DO A COMMAND
  10255. C
  10256. C  COMMANDS INCLUDE:
  10257. C E = ENTER NUMBERS OR FORMULAS
  10258. C M = MOVE DIRECTION (1,2,3,4 = U,D,L,R)
  10259. C D = DISPLAY CHARACTERISTIC CHANGES
  10260. C
  10261. C DISPLAY ALTERING SUBCOMMANDS:
  10262. C  DL V1:V2 RN:M OR CN:M - DISPLAY VARIABLE RANGE V1:V2 AT DISPLAY
  10263. C  ROW OR COL N THRU M.
  10264. C  RN:M MEANS ACROSS A ROW ON DISPLAY STARTING AT DISPLAY COORD N,M
  10265. C  CN:M MEANS DOWN A DISPLAY COLUMN STARTING AT DISPLAY COORD N,M
  10266. C  DF V1:V2 FORMAT
  10267. C  SET FORMAT FOR DISPLAY OF V1 THRU V2 TO FORMAT (NOT INCL. )
  10268. C  A OR L DESIGNATOR SAYS SHOW TEXT IN FORMULA BUFFER. ELSE SHOW
  10269. C  NUMBER VALUE AT THAT LOC.
  10270. C  DT V1:V2 F OR I - SET NUMERIC TYPE OF V1 THRU V2 TO FLOAT OR INT.
  10271. C  DW N,M - SET WIDTH OF COL. N TO M CHARS WIDE.
  10272. C  DB MC,MR - SET MAX COLS TO MC, MAX ROWS TO MR.
  10273. C
  10274. C V = VIEWSCREEN UPDATE. REDISPLAY EVERYTHING FROM SCRATCH.
  10275. C VF = VIEW BUT DISPLAY FORMULAS ALL LOCS.
  10276. C VM = DISABLE REDRAWING SCREEN UNTIL A V IS SEEN.
  10277. C C = COPY NUMBERS/FORMULAS/DISPLAY STUFF(FORMAT)/ALL/RELOCATING
  10278. C 1,2,3,4 = MOVE CURSOR UP,DOWN,LEFT,RIGHT 1 ROW/COL
  10279. C (THESE DO NOT INVALIDATE CALCULATION SO RECALCULATION IS NOT
  10280. C DONE FOR THESE COMMANDS.)
  10281. C F FILENAME/NNN  FILL SCREEN (DISPLAYED PART ONLY) FROM FILENAME,
  10282. C    SKIPPING NNN RECORDS FIRST IF CALLED FOR. /NNN PART OPTIONAL.
  10283. C  (SPLITS STUFF READ IN ACROSS COLUMNS CURRENTLY DEFINED AND
  10284. C   SETS FVLD FOR DISPLAY OF TEXT, NOT #S.)
  10285. C AR/A n R/C ADDS/SUBTRACTS (INSERTS/DELETES) n ROWS OR COLUMNS
  10286. C   AT CURENT LOCATION. AR/AA SELECTS RELOCATING/ABSOLUTE.
  10287. C R = RECALCULATE SHEET. 17 = RECALCULATE MANUALLY ONLY (R RESETS)
  10288. C K = DROP INTO CALC CALCULATOR (*E RETURNS TO SHEET)
  10289. C L = LOCATE CURSOR (MOVE TO POSITION ON SHEET)
  10290. C (L VARIABLE IS THE COMMAND, AND IT LOCATES ORIGIN ON PHYSICAL
  10291. C SHEET. WILL ALSO MOVE CURSOR ON DISPLAY SHEET IF THAT CELL IS
  10292. C DISPLAYED, BUT OTHERWISE DOES NOT DISPLAY THE NUMBER.)
  10293. C Z = ZERO FORMULA/NUMBERS (OR ALL SHEET)
  10294. C  ZERO VARIABLE ZEROES THAT VARIABLE
  10295. C  ZERO VARIABLE1:VARIABLE2 ZEROES THAT RANGE (ROW OR COL)
  10296. C  ZERO * ZEROES ALL OF THE SHEET.
  10297. C X = EXIT (RETURNS TO OS)
  10298. C P = PUT NUMBERS TO FILE. ALWAYS GENERATES P#+nn#+mm forms based on
  10299. C current location.
  10300. C G = GET NUMBERS OUT OF FILE. USES CURRENT ORIGIN FROM L COMMAND OR 1,1
  10301. C TO ENTER NUMBERS (ALLOWS COMBINING DATA).
  10302. C W = WRITE SCREEN ON PRINTER (HARDCOPY FORMAT APPROX. AS DISPLAY.)
  10303. C OA VARIABLE = SET ORIGIN OF DISPLAY SHEET TO VARIABLE LOC IN
  10304. C  PHYSICAL SHEET (CLAMPED TO MAX. SIZE OF SHEET). STARTS AT R1,C1 OF
  10305. C  DISPLAY SHEET.
  10306. C OR VARIABLE = SET ORIGIN OF DISPLAY SHEET TO LOC'N OF VARIABLE IN
  10307. C  PHYSICAL SHEET. MODIFIES DISPLAY SHEET STARTING AT CURRENT DISPLAY
  10308. C  LOCATION RATHER THAN AT 1,1.
  10309. C
  10310. C NOTE THAT N-ARY FUNCTIONS ARE FNAMEARGS,ARGS,...
  10311. C AND RANGES ARE CELL1:CELLN. MULTIPLE COMMANDS IN FORMULA ARE
  10312. C DELIMITED BY \ CHARACTER.
  10313. C
  10314. C RETURN CODES:
  10315. C IF ICODE=1, COMMAND JUST MOVES ON DISPLAY, SO NO NEED TO RECALCULATE
  10316. C THE ENTIRE SHEET.
  10317. C ICODE =-1 ==> REINITIALIZE DISPLAY DEFAULTS
  10318. C ICODE =2  ==> REDRAW WHOLE SCREEN
  10319. C ICODE =-2 ==> NEW SPREAD SHEET FILE SETUP.
  10320. C OTHER: ALL OK.
  10321. 498    CONTINUE
  10322.     KLVL=1
  10323.     ICODE=3
  10324. C DEFAULT RETURN CODE SAYING ALL WELL
  10325. C FIRST DISPLAY CURRENT CELL AGAIN IN NORMAL.
  10326.     THISRW=DROW
  10327.     THISCL=DCOL
  10328.     FORM(1)=0
  10329. C GET IN THE CURRENT FORMAT WHEREVER WE ARE, EVEN IF NOT ON DISPLAY SHEET.
  10330. C    IRRX=(PCOL-1)*60+PROW
  10331.     CALL REFLEC(PCOL,PROW,IRRX)
  10332.     CALL WRKFIL(IRRX,FORM2,0)
  10333.     CALL CE2A(FORM2,FORM)
  10334. C    READ(7'IRRX)FORM
  10335.     IF(THISRW.LE.0.OR.THISCL.LE.0)GOTO 200
  10336.     N1=NRDSP(THISRW,THISCL)
  10337.     N2=NCDSP(THISRW,THISCL)
  10338.     IXLSTC=THISCL
  10339.     IXLSTR=THISRW
  10340.     IF(THISCL.GT.DCLV.OR.THISRW.GT.DRWV)GOTO 200
  10341. C REDRAW LAST DISPLAYED CELL IN NORMAL (I.E., NOT REVERSE) VIDEO.
  10342. C    IF(ICHAR(FVLD(N1,N2)).EQ.0)GOTO 200
  10343. C ONLY REDRAW NUMBERS. DIRECT DISPLAY OR NOTHING GETS IGNORED.
  10344.     J=8
  10345. C    IRRX=(N2-1)*60+N1
  10346.     CALL REFLEC(N2,N1,IRRX)
  10347. C ADD 6 COLS FOR LABELS
  10348.     DO 1 M1=1,DROW
  10349. C FIND DISPLAY COLUMN TO USE
  10350. 1    J=J+CWIDS(M1)
  10351.     J=J-CWIDS(DROW)
  10352. C USE THISCL+1 TO LET 1ST ROW BE LABELS.
  10353.     ICCC=THISCL+2
  10354. C 0 = 1 IF VT100, 0 IF VT52
  10355. C SAVE PHYS COORDS BEING DISPLAYED NEXT. FVLD CAN BE TESTED FOR NUMERICS
  10356. C DIRECTLY, IF UVT100 NEEDS THAT ACCESS.
  10357.     IC1POS=N1
  10358.     IC2POS=N2
  10359.     IF(PZAP.NE.0)GOTO 3607
  10360.     CALL UVT100(1,ICCC,J)
  10361. C SELECT ROW "THISCL", COL "J"
  10362.     CALL UVT100(13,7,0)
  10363.     CALL FVLDGT(N1,N2,FVLD(1,1))
  10364. C    IF(FVLD(1,1).EQ.0)WRITE(6,5538)
  10365. C5538    FORMAT('>-<')
  10366.     ivv=min0(30,cwids(DROW))
  10367. c reset blanks to be sure we write something even for vt52
  10368. ccc    blanks(1)='>'
  10369.     IF(ICHAR(FVLD(1,1)).EQ.0)CALL SWRT(BLANKS,IVV)
  10370. ccc    blanks(1)=32
  10371. cccccc no VT52's in PCs...
  10372. C5538    FORMAT(1H+,30(a1,'\'))
  10373. 3607    CONTINUE
  10374. C WE CAN BE SURE THE COLUMN IS 3 WIDE OR MORE...
  10375.     CALL FVLDGT(N1,N2,FVLDTP)
  10376.     IF(ICHAR(FVLDTP).EQ.0)GOTO 200
  10377. C    IRRX=(N2-1)*60+N1
  10378. C SELECT REVERSE VIDEO
  10379.     DO 5540 KKKK=1,100
  10380. 5540    CMDLIN(KKKK)=char(32)
  10381.     CALL WRKFIL(IRRX,FORM2,0)
  10382.     CALL CE2A(FORM2,FORM)
  10383. C    READ(7'IRRX)FORM
  10384. C    IF(JCHAR(FORM(120)).LE.0)GOTO 200
  10385.     IF(JCHAR(FVLDTP).LT.0.OR.FORMFG.NE.0)
  10386.      1  WRITE(CMDLNA(1:127),8201)(FORM(II),II=1,100)
  10387. 8201    FORMAT(128A1)
  10388.     IF(FORMFG.NE.0)GOTO 4320
  10389.     DO 6301 KKK=1,9
  10390.     KKKK=ICHAR(FORM(KKK+119))
  10391. C    KKKK=DFMTS(KKK,THISRW,THISCL)
  10392. 6301    DFE(KKK+1)=CHAR(MAX0(32,KKKK))
  10393.     DFE(11)=CHAR(32)
  10394. C 32 = ASCII SPACE
  10395.     DFE(1)='('
  10396.     DFE(12)=' '
  10397.     DFE(13)=' '
  10398.     DFE(14)=')'
  10399.     CALL TYPGET(N1,N2,TYPE(1,1))
  10400.     IF(TYPE(1,1).EQ.2.AND.JCHAR(FVLDTP).GT.0)
  10401.      1  WRITE(CMDLNA(1:127),DFE,ERR=4320)DVS(THISRW,THISCL)
  10402.     IF(TYPE(1,1).NE.2.AND.JCHAR(FVLDTP).GT.0)
  10403.      1   WRITE(CMDLNA(1:127),DFE,ERR=4320)LDVS(1,THISRW,THISCL)
  10404. C REDRAW THIS COL. WITH REVERSE VIDEO HERE.
  10405. 4320    IF(PZAP.EQ.0)CALL SWRT(CMDLIN,CWIDS(THISRW))
  10406. C9800    FORMAT('+',128(A,'\'))
  10407. 9000    FORMAT(128A1)
  10408.     IF(PZAP.EQ.0)CALL UVT100(13,0,0)
  10409. C NOTE THIS REDRAWS PREVIOUS COL. IN REVERSE VIDEO.
  10410. C NO CARRIAGE CTL
  10411. 200    CONTINUE
  10412.     IF(PZAP.NE.0)GOTO 3608
  10413.     KKKK=JCHAR(FVLDTP)
  10414. C SKIP LAST LINE UPDATE IF NOT NEEDED FOR SPEEDIER CURSOR
  10415. C POSITIONING.
  10416.     IF(NULAST.EQ.NCEL.AND.LFVD.EQ.0.AND.KKKK.EQ.0)GOTO 222
  10417.     CALL UVT100(1,LLDSP,1)
  10418.     CALL UVT100(12,2,0)
  10419.     IF(JCHAR(FORM(1)).LE.0)GOTO 222
  10420.     DO 1711 IVVVV=1,109
  10421.         IVV=110-IVVVV
  10422.     IF(JCHAR(FORM(IVV)).GT.32)GOTO 2711
  10423. 1711    CONTINUE
  10424. 2711    CONTINUE
  10425.     write(fwt(1:127),9092)ncel,(form(ii),ii=1,IVV)
  10426. 9092    FORMAT(1X,I5,' Used. Curr=',109A1)
  10427.     IVV=IVV+18
  10428.     call swrt(fwt(1:127),IVV)
  10429. C3608    CONTINUE
  10430. 222    CALL UVT100(1,LLCMD,1)
  10431.     NULAST=NCEL
  10432.     LFVD=KKKK
  10433.     CALL UVT100(12,2,0)
  10434. C NOTE PROW IS ACROSS TOP, PCOL IS DOWN SIDE
  10435. C PROW GOES AS ID1, ALPHAS
  10436. C PCOL GOES AS ID2, NUMERICS
  10437.     CALL IN2AS(PROW,FORM)
  10438. C NOTE PCOL STARTS AT 2 FOR NORMAL SHEET VARIABLES. PCOL=1 IS FOR ACCUMULATORS
  10439.     CALL UVT100(13,0,0)
  10440. C WRITE OUT LABEL WITH APPROPRIATE SIZE TO HOLD ROW NUMBER
  10441. C LET PROMPT END WITH > OR : DEPENDING ON OPERATING MODE.
  10442.     FVLDTP='>'
  10443.     IF(MODPUB.EQ.1)FVLDTP=':'
  10444.     IF(PCOL.GE.10000)GOTO 6401
  10445.     ii=pcol-1
  10446.     write(fwt(1:127),9001,err=3608)
  10447.      1   (form(i),i=1,4),ii,FVLDTP
  10448. C    FORM(9)=FVLDTP
  10449.     III=9
  10450.     GOTO 6402
  10451. 6401    CONTINUE
  10452.     ii=pcol-1
  10453.     write(fwt(1:127),9401,err=3608)
  10454.      1   (form(i),i=1,4),ii,FVLDTP
  10455. C    FORM(10)=FVLDTP
  10456.     III=10
  10457. 6402    CONTINUE
  10458.     CALL SWRT(fwt(1:127),III)
  10459. 9401    FORMAT(4A1,I5,1A1)
  10460. 9001    FORMAT(4A1,I4,1A1)
  10461. 3608    CONTINUE
  10462.     IF(XTCFG.NE.0)GOTO 3870
  10463.     Rewind 11
  10464.     IF(IOLVL.NE.11.or.FH.eq.0)READ(IOLVL,9002,END=510,ERR=510)CMDLIN
  10465. C FOR READING THE CONSOLE, WE NEED A QIO$ TO CAPTURE ESCAPE SEQUENCES.
  10466.     IF(IOLVL.EQ.11.and.FH.ne.0)CALL GETTTL(CMDLIN)
  10467.     CALL GTMUNG(CMDLIN)
  10468. C ALLOW CMD LANGUAGE TO LOOK MORE "STANDARD" VIA MUNGE OF INPUTS
  10469. C TO DO THE "EV" OR "ET" OR "EN" FOR USER AND TREAT / AS CMD
  10470. C PREFIX...
  10471.     GOTO 3871
  10472. 3870    CONTINUE
  10473.     XTCFG=0
  10474.     DO 3872 I=1,XTNCNT
  10475.     CMDLIN(I)=XTNCMD(I)
  10476. 3872    CONTINUE
  10477. C COPY IN EXTERNAL COMMAND AND LET IT BE EXECUTED. IT'S THE USER'S
  10478. C PROBLEM IF THE COMMAND REQUIRES STILL FURTHER INPUT...
  10479. C ALSO NULL OUT SOME DELIMITER CHARS AFTER THE COMMAND READ IN.
  10480.     CMDLIN(XTNCNT+1)=Char(0)
  10481.     CMDLIN(XTNCNT+2)=Char(0)
  10482. 3871    CONTINUE
  10483. 9002    FORMAT(64A1,64A1,32A1)
  10484.     CMDLIN(132)=Char(0)
  10485.     CMDLIN(131)=Char(0)
  10486.     CMDLIN(130)=Char(0)
  10487. C  SAVE CURRENT PHYS ROW, COL IN AC'S X AND Y
  10488.     XXAC=PROW
  10489.     XYAC=PCOL
  10490. C ZAP IN SPECIAL FUNCTION KEY REPLIES INTO NORMAL FORMS
  10491.     CALL CMDMUN(CMDLIN)
  10492.     DO 9048 I=1,129
  10493.     K=130-I
  10494. C START AT BACK OF LINE AND ZAP WHITESPACE BY NULL TERMINATOR
  10495.     IF(ICHAR(CMDLIN(K)).GT.32)GOTO 9049
  10496.     CMDLIN(K)=Char(0)
  10497. C ALSO GET RID OF POSSIBLE TRAILING CR, LF.
  10498. 9048    CONTINUE
  10499. 9049    CONTINUE
  10500. C
  10501. C THIS GETS COMMAND LINE IN. NOW ACTON IT.
  10502. C REPOS'N TO OLD LINE NOW.
  10503.     CALL UVT100(1,LLCMD,1)
  10504. C
  10505. C THE FOLLOWING SECTION IMPLEMENTS THE ADDITIONAL FUNCTION OF
  10506. C JOURNALING: (DONE ON VAX ONLY SINCE SPACE REQUIREMENTS FOR FILE
  10507. C OPERATIONS MAY BE A PROBLEM ON PDP11'S).
  10508. C    Command +J FILENAME will record all remaining
  10509. C    line inputs at this point in it. (Assumes JNLFLG=0 initially)
  10510. C    Command +N closes journal file.
  10511.     K=K+1
  10512.     IF(CMDLIN(1).EQ.'+'.AND.CMDLIN(2).EQ.'J'.AND.JNLFLG.NE.1)
  10513.      1   GOTO 4290
  10514.     IF(CMDLIN(1).EQ.'+'.AND.CMDLIN(2).EQ.'N')GOTO 4292
  10515.     IF(JNLFLG.EQ.1)WRITE(10,9002)(CMDLIN(IV),IV=1,K)
  10516.     GOTO 4291
  10517. 4292    CONTINUE
  10518.     CLOSE(10)
  10519.     JNLFLG=0
  10520.     GOTO 9990
  10521. 4290    CONTINUE
  10522.     JNLFLG=1
  10523. C    USE WHATEVER FILE NAME THE USER HAS SUPPLIED AFTER THE +J
  10524. C    FOR FILE TO JOURNAL ONTO. (NO MORE QUESTIONS NEEDED.)
  10525.     CALL WASSIG(10,CMDLIN(4))
  10526.     GOTO 9990
  10527. 4291    CONTINUE
  10528. C
  10529. C
  10530. C ALLOW COMMENTS IF LINE BEGINS WITH * (JUST LIKE CALC)
  10531.     IF(CMDLIN(1).NE.'*')GOTO 6002
  10532.     ICODE=1
  10533. C NO RECALC JUST FOR COMMENTS...
  10534.     GOTO 9990
  10535. 6002    CONTINUE
  10536. C
  10537. C * NEW ****************
  10538. C ADD PLACE TO PUT IN USER COMMANDS. DEFAULT IS NONE EXIST, DO NOTHING
  10539.     IGOTIT=0
  10540.     CALL USRCMD(CMDLIN,ICODE,IGOTIT)
  10541. C WHEN WE GET A COMMAND, SET IGOTIT TO 1 AND WE THEN PROCESS COMMAND NORMALLY
  10542.     IF(IGOTIT.EQ.1)GOTO 9990
  10543. C * NEW ****************
  10544. C
  10545. C COMMAND -PROMPT  WILL READ FROM LUN 5 TO ARGSTR
  10546. C TERMINATING WITH SPACES.
  10547.     IF(CMDLIN(1).NE.'-')GOTO 350
  10548.     ICODE=5
  10549.     CALL UVT100(1,LLCMD,1)
  10550.     CALL UVT100(12,2,0)
  10551.     CALL VWRT(CMDLIN(2),49)
  10552. C    WRITE(0,9800)(CMDLIN(IV),IV=2,50)
  10553.     call vget(form2,128)
  10554. c    READ(11,9000,END=510,ERR=510)FORM2
  10555.     II=1
  10556.     KK=1
  10557.     DO 351 KKK=1,128
  10558. C LOAD UP OUR ARGUMENTS IN ARGSTR(N,1) TO ARGSTR(N,4)
  10559.     ARGSTR(KK,II)=FORM2(KKK)
  10560.     KK=KK+1
  10561.     ARGSTR(KK,II)=0
  10562.     IF(KK.LT.52)GOTO 352
  10563. 354    KK=1
  10564.     II=II+1
  10565.     IF(II.GT.4)GOTO 353
  10566. 352    CONTINUE
  10567.     IF(ICHAR(FORM2(KKK)).GT.32)GOTO 351
  10568. C ON SPACE, GO TO THE NEXT ARGUMENT. ALSO SPILL INTO
  10569. C THE NEXT ARGUMENT IF WE SEE NO SPACES AND JUST TRAIL ALONG.
  10570.     GOTO 354
  10571. 351    CONTINUE
  10572. 353    GOTO 9990
  10573. 350    CONTINUE
  10574. C
  10575. C CONTROL SCROLLING. PERMIT THE COMMAND "SC" TO TURN SCROLLING ON
  10576. C AND "NS" TO TURN IT BACK OFF.
  10577.     IVV=-1
  10578.     IF(CMDLIN(1).EQ.'S'.AND.CMDLIN(2).EQ.'C')IVV=1
  10579.     IF(CMDLIN(1).EQ.'N'.AND.CMDLIN(2).EQ.'S')IVV=0
  10580.     IF(IVV.GE.0)IDOL7=IVV
  10581.     IF(IVV.GE.0)ICODE=5
  10582.     IF(IVV.GE.0)GOTO 9990
  10583. C
  10584. C ALLOW PROGRAMMED "REWIND" OF INPUT COMMAND LINE ON
  10585. C COMMAND LINE BEGINNING WITH "<". MAKE IT CONDITIONAL
  10586. C BY SAYING THAT IF % IS NEGATIVE WE WON'T DO IT.
  10587.     IF(CMDLIN(1).NE.'<')GOTO 356
  10588.     ICODE=5
  10589.     IF(XAC.GT.0..AND.IOLVL.NE.11)REWIND IOLVL
  10590.     GOTO 9990
  10591. 356    CONTINUE
  10592. C
  10593. C HANDLE @FILE COMAND TO CHANGE TO INPUT OFF THAT FILE.
  10594.     IF(CMDLIN(1).NE.'@')GOTO 511
  10595. C WOW, A FILE. (OR AT LEAST SO WE HOPE).
  10596.     CALL RASSIG(3,CMDLIN(2))
  10597. C USE FACT THAT WE JUST NULL TERMINATED THE FILENAME PART AND SET
  10598. C IT TO BE LUN 3.
  10599.     IOLVL=3
  10600. C NOW GO BACK FOR ANOTHER COMMAND...NO SENSE WASTING RECALC TIME SINCE
  10601. C NOTHING HAS REALLY HAPPENED YET.
  10602. C NOTE EVERY READ TO LUN 3 HAS EOF/ERROR CHECK TO GO TO 510 TO RESET
  10603. C TO LUN 5 INPUT AND CLOSE FILE WE OPENED ON 3.
  10604.     GOTO 498
  10605. 511    CONTINUE
  10606. C
  10607. C AA n R, AA n C, AR n R, AR n C COMMANDS
  10608. C
  10609.     IF(CMDLIN(1).NE.'O'.OR.CMDLIN(2).NE.'V')GOTO 6887
  10610. C OV + TURNS ON OVERRIDE
  10611. C OV - TURNS OFF OVERRIDE
  10612. C ALLOWS ONE TO OVERRIDE $ SIGN FORMS' ABSOLUTE NATURE
  10613.     IF(CMDLIN(3).EQ.'+'.OR.CMDLIN(4).EQ.'+')IDOL3=1
  10614.     IF(CMDLIN(3).EQ.'-'.OR.CMDLIN(4).EQ.'-')IDOL3=0
  10615.     GOTO 9990
  10616. 6887    CONTINUE
  10617.     IF(CMDLIN(1).NE.'A')GOTO 8845
  10618. C ADD ROWS OR COLUMNS (OR REMOVE THEM) AT THE CURRENT PHYSICAL LOCATION
  10619. C WHERE AA MEANS ADD ABSOLUTE (NO RELOCATION), AR MEANS ADD RELOCATING
  10620. C (RELOCATE ALL VARIABLES BELOW), AND R OR C SAYS TO ADD/SEBTRACT ROWS
  10621. C OR COLUMNS.
  10622. C
  10623. C FIRST COLLECT THE ARGUMENTS TO THE FUNCTION.
  10624.     KM1=3
  10625.     KM2=10
  10626.     CALL GN(KM1,KM2,ICNT,CMDLIN)
  10627. C GETS THE NUMBER. IF NO NUMBER SEEN OR ZERO, RETURNS 0. IGNORE THEN.
  10628.     IF(ICNT.EQ.0)GOTO 9990
  10629.     ICR=0
  10630. C LOOK FOR THE R OR C
  10631. C START AT CMDLIN(4) TO PASS THE AR/AA AND THE NUMBER IF ANY.
  10632.     DO 8844 KKK=4,50
  10633.     IF(CMDLIN(KKK).EQ.'R')ICR=1
  10634.     IF(CMDLIN(KKK).EQ.'C')ICR=2
  10635.     IF(ICR.NE.0)GOTO 8846
  10636. C SKIP OUT ON FIRST ROW OR COLUMN DESIGNATOR SEEN
  10637. 8844    CONTINUE
  10638. 8846    CONTINUE
  10639.     IF(ICR.EQ.0)GOTO 9990
  10640.     ICODE=2
  10641. C NOW WE HAVE ALL ARGUMENTS. SET UP FOR THE COPY AND PARASITE THE
  10642. C LOGIC USED FOR THE CA OR CR COMMANDS. (NOTE THAT 2ND CHARACTER
  10643. C IS A OR R IN CMDLIN ALREADY SO THOSE COMMANDS' LOGIC WILL BE OK.)
  10644.     JRTR=PROW
  10645.     JRTC=PCOL
  10646.     IF(ICR.EQ.2)JRTC=1
  10647.     IF(ICR.EQ.1)JRTR=1
  10648. C RELOC THESHOLD IS PHYSICAL CURRENT POSITION.
  10649.     IF(ICR.EQ.1)GOTO 8843
  10650. C INSERT OR DELETE COLUMNS
  10651. C FIRST FIGURE OUT HOW MANY COLUMNS MUST BE MOVED RIGHT
  10652.     KD=MCols-PROW-IABS(ICNT)+1
  10653. C LET THIS WORK ONLY ON PRIME SHEET. TOO HARD TO FIGURE IT OUT ON REFLECTED
  10654. C ONES AND IT'LL FOUL LOTS OF USERS UP.
  10655.     IF(KD.LE.0)GOTO 9990
  10656. C CAN'T MOVE 0 COLUMNS. DOESN'T MAKE SENSE.
  10657.     DO 8842 KR=1,KD
  10658.     IRA=MCols-KR+1
  10659. C IRA IS DESTINATION COLUMN IN EACH LOOP.
  10660.     IF(ICNT.LT.0)IRA=PROW-1+KR
  10661. C IRS IS SOURCE COLUMN
  10662.     IRS=MCols-KR+1-ICNT
  10663.     IF(ICNT.LT.0)IRS=PROW+KR-ICNT-1
  10664. C
  10665. C IF DELETING COLUMNS AND DESTINATION IS PAST CURRENT
  10666. C ACTIVE MAX, SKIP THE MOVE SINCE WE'RE NOT ACCOMPLISHING ANYTHING.
  10667.     IF(ICNT.LT.0.AND.IRA.GT.RRWACT)GOTO 8842
  10668. C IF ADDING COLUMNS AND SOURCE IS PAST CURRENT MAX ACTIVE THEN
  10669. C WE'RE DOING NOTHING, SO SKIP THE WORK
  10670.     IF(ICNT.GT.0.AND.IRS.GT.RRWACT)GOTO 8842
  10671.     JDELT=RCLACT
  10672. C    JDELT=301
  10673. C LOOP WE'LL CALL IS OVER ENTIRE ROWS, BUT ONLY DO ONE AT A TIME HERE
  10674.     JD1A=IRA
  10675.     JD1B=1
  10676.     ID1A=IRS
  10677.     ID2A=1
  10678.     I1IN=0
  10679.     I2IN=1
  10680.     JIN1=0
  10681.     JIN2=1
  10682.     ASSIGN 8840 TO KPYBAK
  10683. C CALL INTERNAL COPY-RANGE PROCEDURE INSIDE CA/CR LOGIC
  10684.     GOTO 8364
  10685. 8840    CONTINUE
  10686. 8842    CONTINUE
  10687. C
  10688. C NOW CLEAN UP THE REST OF FORMULAS IF THERE ARE ANY TO DO...
  10689. C MUST RELOCATE OTHER FORMULAE IF CMDLIN(2) IS R
  10690.     KX=PROW-1
  10691. C RELY ON RCLACT HAVING BEEN UPDATED TO REFLECT NEW
  10692. C ADDITIONS IF ANY
  10693.     KY=RCLACT
  10694. C    KY=301
  10695. C RELOCATE UPPER LEFT PART OF SHEET
  10696. C NOTE II1,II2,JJ1,JJ2,JRTR,JRTC ARE UNCHANGED FROM PRIOR CALL SO
  10697. C MAY BE USED... RELVBL ONLY CARES ABOUT RELATIVE MOTION ANYHOW...
  10698. 3600    CONTINUE
  10699.     IF(CMDLIN(2).NE.'R'.OR.KX.LE.0.OR.KY.LE.0)GOTO 9990
  10700.     DO 3601 KK=1,KX
  10701.     DO 3601 KK2=1,KY
  10702.     CALL FVLDGT(KK,KK2,FVLD(1,1))
  10703.     IF(ICHAR(FVLD(1,1)).NE.1)GOTO 3601
  10704. C ONLY RELOCATE FORMULAS, NOT TEXT OR NUMBERS (OR EMPTIES...)
  10705. C    IRX=(KK2-1)*60+KK
  10706.     CALL REFLEC(KK2,KK,IRX)
  10707.     CALL WRKFIL(IRX,FORM,0)
  10708. C    READ(7'IRX)FORM
  10709.     CALL RELVBL(FORM,FORM2,II1,II2,JJ1,JJ2,JRTR,JRTC)
  10710.     CALL WRKFIL(IRX,FORM2,1)
  10711. C    WRITE(7'IRX)FORM2
  10712. 3601    CONTINUE
  10713.     GOTO 9990
  10714. 8843    CONTINUE
  10715. C ROW INSERT/DELETE
  10716. C AGAIN FIND HOW MANY ROWS TO MOVE.
  10717.     KD=MRows-PCOL-IABS(ICNT)+1
  10718.     IF(KD.LE.0)GOTO 9990
  10719.     DO 8839 KC=1,KD
  10720. C ICA = DESTINATION AND ICS IS SOURCE
  10721.     ICA=MRows-KC+1
  10722.     ICS=MRows-KC+1-ICNT
  10723.     IF(ICNT.GT.0)GOTO 8838
  10724.     ICA=PCOL-1+KC
  10725.     ICS=PCOL+KC-1-ICNT
  10726. 8838    CONTINUE
  10727. C IF INSERTING ROWS AND SRC ROW IS BEYOND ACTIVE AREA, SKIP
  10728.     IF(ICNT.GT.0.AND.ICS.GT.RCLACT)GOTO 8839
  10729. C IF DELETING ROWS AND DST ROW IS BEYOND ACTIVE AREA, SKIP
  10730.     IF(ICNT.LT.0.AND.ICA.GT.RCLACT)GOTO 8839
  10731. C NOW CALL COPY LOOP AGAIN.
  10732.     JDELT=RRWACT
  10733. C    JDELT=60
  10734.     JD1A=1
  10735.     JD1B=ICA
  10736. C DEST
  10737.     ID1A=1
  10738.     ID2A=ICS
  10739. C SOURCE
  10740.     I1IN=1
  10741.     I2IN=0
  10742.     JIN1=1
  10743.     JIN2=0
  10744.     ASSIGN 8836 TO KPYBAK
  10745. C CALL INTERNAL RANGE COPY PROCEDURE TO COPY A ROW
  10746.     GOTO 8364
  10747. 8836    CONTINUE
  10748. 8839    CONTINUE
  10749.     KX=RRWACT
  10750. C    KX=60
  10751.     KY=PCOL-1
  10752.     GOTO 3600
  10753. 8845    CONTINUE
  10754. C OA AND OR COMMANDS. SET DISPLAY SHEET MAPPING TO ORIGIN AS FOUND BY
  10755. C  VARIABLE, STARTING AT 1,1 OR (DROW,DCOL) FOR OA AND OR RESPECTIVELY.
  10756.     IF(CMDLIN(1).NE.'O')GOTO 650
  10757. C PROCESS COMMAND...
  10758.     LRO=1
  10759.     LCO=1
  10760.     IF(CMDLIN(2).EQ.'R')LRO=MAX0(1,DROW)
  10761.     IF(CMDLIN(2).EQ.'R')LCO=MAX0(1,DCOL)
  10762. C OM will act like OR in that it will set the mapping of a
  10763. C display starting at the cursor, but unlike OR it will
  10764. C map multiple pages. When 3D actions are disabled it will
  10765. C do nothing.
  10766.     KORM=0
  10767.     IF(CMDLIN(3).NE.'M')GOTO 3944
  10768.     IF(K3DFG.LE.0)GOTO 3924
  10769. C OAMC/ORMC cell remaps display so that each display column is
  10770. C a column from the next lower sheet, so that, for example,
  10771. C a first column might be a1:a20, the next might be a1%1:a20%1,
  10772. C the next a1%2:a20%2 and so on.
  10773. C
  10774. C OAMR/ORMR cell remaps display so that each display row is a row
  10775. C from the next lower sheet, so that for example the first
  10776. C row might be a1:g1, the next a1%1:g1%1, the next a1%2:g1%2
  10777. C and so on. 
  10778. C
  10779. C  Thus the operation ORMC fills the 1st column with the current
  10780. C sheet, then the next with the offsets of the first plus the
  10781. C sheet offset, and so on. ORMR fills the 1st row with the
  10782. C current sheet, then sheet offsets down.
  10783.     IF(CMDLIN(4).EQ.'C')KORM=1
  10784.     IF(CMDLIN(4).EQ.'R')KORM=2
  10785.     IF(KORM.EQ.0)GOTO 3924
  10786. 3944    CONTINUE
  10787. c *** 20 by 75 display constants hardcoded here:
  10788.     LRO=MIN0(LRO,19)
  10789.     LCO=MIN0(LCO,74)
  10790. C    LRO=MIN0(LRO,(20-1))
  10791. C    LCO=MIN0(LCO,(75-1))
  10792. C NOW HAVE CORRECT ORIGIN IN DISPLAY SHEET TO USE SET UP.
  10793. C GRAB VARIABLE ID.
  10794.     LA=INDX(CMDLIN,32)
  10795.     IF(LA.GT.20)LA=3
  10796.     LE=40
  10797.     CALL VARSCN(CMDLIN,LA,LE,LSTCX,ID1,ID2,IVLD)
  10798.     IF(IVLD.EQ.0)GOTO 651
  10799. C NOW HAVE VARIABLE NAME AND LOCATION... CAN DO IT FINALLY.
  10800. C NOTE WE'RE GUARANTEED WE START OFF IN BOUNDS BUT MUST CHECK
  10801. C ALONG THE WAY TO BE SURE WE STAY THAT WAY.
  10802.     IQQ=0
  10803.     KKKK=0
  10804. C allow a D modifier (for whatever it's worth) after
  10805. C the ORMR/ORMC/OAMR/OAMC commands. It will be as close to
  10806. C the normal OAD/ORD as practical under the circumstances of
  10807. C a totally different mapping scheme.
  10808.     IF(KORM.NE.0.and.CMDLIN(5).eq.'D')KKKK=1
  10809.     IF(CMDLIN(3).NE.'D')GOTO 6712
  10810. c allow ORA or ORD commands to leave window displacements
  10811. c alone. Fix up so this is default mode for scrolling (making
  10812. c program behavior easier to understand.)
  10813. 7112    CONTINUE
  10814.     KKKK=1
  10815. 6712    CONTINUE
  10816.     KKKKK=NRDSP(LRO,LCO)
  10817.     KKKKKK=NCDSP(LRO,LCO)
  10818. 5711    CONTINUE
  10819. C TO ALLOW REFLECTIONS MUST ALLOW ALL SORTS OF ORIGINS.
  10820.     DO 652 IRO=LRO,DRWV
  10821.     DO 653 ICO=LCO,DCLV
  10822. C HERE CAN SET UP NRDSP AND NCDSP SUITABLY
  10823.     IVV=IRO-LRO
  10824.     IVVV=ICO-LCO
  10825.     IF(KKKK.EQ.0)GOTO 1653
  10826.     IVV=NRDSP(IRO,ICO)-KKKKK
  10827.     IVVV=NCDSP(IRO,ICO)-KKKKKK
  10828. 1653    CONTINUE
  10829.     if(korm.ne.1)goto 2653
  10830. C OMC column mode remap.
  10831. C Bump offsets by kcdelt/krdelt as iro grows BUT
  10832. C not as ico grows.
  10833.     IVV=(LRO-1)+(iro-lro)*kcdelt
  10834.     IVVV=IVVV+(iro-lro)*krdelt
  10835. 2653    Continue
  10836.     if(korm.ne.2)goto 2654
  10837. C OMR row mode remap.
  10838. C bump offsets by kcdelt/krdelt as ico grows BUT not as
  10839. C iro grows.
  10840.     IVV=IVV+(ico-lco)*kcdelt
  10841.     IVVV=(LCO-1)+(ico-lco)*krdelt
  10842. 2654    Continue
  10843.     NRDSP(IRO,ICO)=ID1+IVV
  10844.     NCDSP(IRO,ICO)=ID2+IVVV
  10845. 653    CONTINUE
  10846. 652    CONTINUE
  10847.     IF(DROW.LE.0.OR.DCOL.LE.0)GOTO 3924
  10848.     PROW=NRDSP(DROW,DCOL)
  10849.     PCOL=NCDSP(DROW,DCOL)
  10850. 3924    CONTINUE
  10851. C FORCE REDRAW OF WHOLE SHEET.
  10852.     ICODE=6
  10853.     IF(RCMODE.LE.0)GOTO 9990
  10854. C SKIP RECALC IF IN OLD MODE...
  10855.     ICODE=2
  10856. 651    GOTO 9990
  10857. 650    CONTINUE
  10858. C F FILENAME/NNN
  10859. C READ IN TEXT FROM FILE NAMED AND SPREAD ACROSS DISPLAY SCREEN. SET
  10860. C DISPLAYED SCREEN INTO FVLD(NN)=-1 TO SHOW TEXT ONLY.
  10861.     IF(CMDLIN(1).NE.'F')GOTO 1740
  10862.     LA=INDX(CMDLIN,32)
  10863. C PASS SPACE
  10864.     KKK=ICHAR('/')
  10865.     LB=INDX(CMDLIN(LA+1),KKK)
  10866.     LB=LB+LA
  10867. C LB= LOC OF / CHARACTER
  10868.     LB=MIN0(80,LB)
  10869.     IF(LB.LE.2)GOTO 1741
  10870.     IF((LB-LA).LE.1) GOTO 1741
  10871.     CMDLIN(LB)=0
  10872.     CALL RASSIG(4,CMDLIN(LA+1))
  10873. C THIS OUGHT TO OPEN THE FILE IF IT EXISTS..
  10874. C NOW IF THERE'S A NUMBER THERE, EXTRACT IT.
  10875.     LSKP=0
  10876.     IF(LB.GT.78.OR.LB.LE.5)GOTO 1743
  10877.     LAA=LB+1
  10878.     LAAA=LB+7
  10879.     CALL GN(LAA,LAAA,LSKP,CMDLIN)
  10880. 1743    CONTINUE
  10881. C NOW SKIP THE LINES
  10882.     IF(LSKP.LE.0)GOTO 1744
  10883.     DO 1745 IV=1,LSKP
  10884.     READ(4,8201,END=1742,ERR=1742)FORM2
  10885. 1745    CONTINUE
  10886. 1744    CONTINUE
  10887. C NOW WE'RE READY TO READ IN THE STUFF.
  10888.     ICODE=2
  10889.     DO 1746 LA=1,DCLV
  10890.     DO 1751 IV=1,128
  10891. 1751    FORM2(IV)=Char(32)
  10892.     READ(4,8201,END=1742,ERR=1742)FORM2
  10893.     IXC=0
  10894.     DO 1747 LB=1,DRWV
  10895. C DRWV = # ACROSS TOP...
  10896. C DCLV=LENGTH
  10897.     ID1=NRDSP(LB,LA)
  10898.     ID2=NCDSP(LB,LA)
  10899. C GET PHYSICAL SHEET COORDINATES AS ID1,ID2
  10900. C MUST THEN COPY CWIDS(LB) CHARS ONTO FILE...
  10901.     CALL FVLDST(ID1,ID2,char(255))
  10902. C    FVLD(ID1,ID2)=-1
  10903. C    IRX=(ID2-1)*60+ID1
  10904.     CALL REFLEC(ID2,ID1,IRX)
  10905.  
  10906.     CALL WRKFIL(IRX,FORM,0)
  10907. C    READ(7'IRX)FORM
  10908.     FORM(119)=Char(255)
  10909.     DO 1749 IVV=1,110
  10910. 1749    FORM(IVV)=0
  10911.     DO 1748 IVV=1,CWIDS(LB)
  10912.     IXC=IXC+1
  10913. 1748    FORM(IVV)=FORM2(IXC)
  10914.     CALL WRKFIL(IRX,FORM,1)
  10915. 1747    CONTINUE
  10916. 1746    CONTINUE
  10917. 1742    CLOSE(4)
  10918. 1741    GOTO 9990
  10919. 1740    CONTINUE
  10920.     IF(CMDLIN(1).NE.'E')GOTO 8000
  10921. C ENTER COMMAND
  10922. C EN expression. expression may be numbers/text.
  10923.     LA=INDX(CMDLIN,32)
  10924.     LA=LA+1
  10925. C SKIP SPACE AFTER "EN"
  10926.     IF(LA.GT.4)LA=4
  10927.     IF (LA.GE.100)GOTO 7901
  10928.     LE=132-LA
  10929.     LE=MIN0(110,LE)
  10930. C    IRX=(PCOL-1)*60+PROW
  10931.     CALL REFLEC(PCOL,PROW,IRX)
  10932. C FIND WHERE IN FILE TO STORE.
  10933.     CALL WRKFIL(IRX,FORM2,0)
  10934.     CALL CE2A(FORM2,FORM)
  10935. C    READ(7'IRX)FORM
  10936.     IF(CMDLIN(2).EQ.'D')
  10937.      1   CALL SED(CMDLIN(LA),FORM,FORM2,ARGSTR,ZAC,110)
  10938. C IF COMMAND IS "ED <DELIM>STRING1<DELIM>STRING2<DELIM>" THEN
  10939. C  SUBSTITUTE STRING2 FOR STRING1 IN FORMULA, RETURN IT TO THE
  10940. C  COMMAND LINE, AND REENTER IT.
  10941. C  NOTE THAT THE STRINGS MAY CONTAIN &n FORMS WHERE 1-4 MEAN
  10942. C  ENTERED ARGUMENTS 1-4, 5 TREATS XAC AS A NUMBER, AND 6
  10943. C  TREATS ZAC AS A SINGLE CHARACTER (ZAC IS VARIABLE Z).
  10944.     DO 5133 II=1,110
  10945. 5133    FORM(II)=0
  10946.     NALF=0
  10947.     NSG=-1
  10948.     NXNUM=3
  10949.     KSG=0
  10950.     N=1
  10951.     IRCE1=PROW
  10952.     IRCE2=PCOL
  10953. C SAVE FOR RE, RI MODES
  10954.     IF(CMDLIN(2).EQ.'T'.OR.CMDLIN(2).EQ.'"')KSG=1
  10955. C "ET" FORMULA ENTERS TEXT ONLY
  10956. C "EV" FORMULA ENTERS NUMBER
  10957.     IF(CMDLIN(2).EQ.'V')NSG=1
  10958. 2097    CONTINUE
  10959.     IF(N.GT.LE)GOTO 7902
  10960. C    DO 7902 N=1,LE
  10961. C LOOK FOR ALPHAS. IF WE FIND ANY, FLAG NOT NUMERIC
  10962. C NOTE @ INCLUDED SINCE COULD HAVE A *@3 COMMAND TO CALL 3.CMD
  10963. C AND REFER TO OTHER CELLS.
  10964. C THIS IS A RESTRICTION: COMMANDS TO CMND NEED TO HAVE ALPHAS
  10965. C SOMEWHERE OR THIS WILL BE FOOLED.
  10966.     IF(CMDLIN(LA).EQ.'P'.AND.
  10967.      1  CMDLIN(LA+1).EQ.'#'.AND.
  10968.      2  CMDLIN(LA+2).EQ.'0'.AND.
  10969.      3  CMDLIN(LA+3).EQ.'#'.AND.
  10970.      4  CMDLIN(LA+4).EQ.'0') GOTO 3356
  10971.     IF(ICHAR(CMDLIN(LA)).GE.ICHAR('@').AND.ICHAR(CMDLIN(LA))
  10972.      1  .LE.ICHAR('Z'))NXNUM=1
  10973. 3356    CONTINUE
  10974.     IF(CMDLIN(LA).EQ.'+'.OR.CMDLIN(LA).EQ.'-')NSG=1
  10975.     IF(CMDLIN(LA).EQ.'['.OR.CMDLIN(LA).EQ.'.')NSG=1
  10976.     IF(CMDLIN(LA).EQ.'(')NSG=1
  10977.     IF(CMDLIN(LA).EQ.'"')KSG=1
  10978. C ON SEEING THE _@V1,V2 CONSTRUCT, REPLACE WITH THE VARIABLE
  10979. C ADDRESSED BY V1,V2 (COL,ROW) BY NAME.
  10980. C ON SEEING THE _#V1 CONSTRUCT, UNPACK UP TO 8 CHARS OUT OF
  10981. C REAL*8 VARIABLE (PACKED BY MULTIPLYING BY 128 EARLIER).
  10982. C  IN EACH CASE, ADJUSTN AND LE TO CONTINUE APPROPRIATELY.
  10983.     IF(ICHAR(CMDLIN(LA)).GT.32)NALF=NALF+1
  10984.     IF(CMDLIN(LA).EQ.'_'.AND.CMDLIN(LA+1).EQ.'@')CALL
  10985.      1  SVBL(CMDLIN,LA,N,LE,FORM)
  10986.     IF(CMDLIN(LA).EQ.'_'.AND.CMDLIN(LA+1).EQ.'#')CALL
  10987.      1  SSTR(CMDLIN,LA,N,LE,FORM)
  10988.     FORM(N)=CMDLIN(LA)
  10989.     LA=LA+1
  10990. C FAKE OUT DO LOOP SINCE SVBL OR SSTR MAY MUNG INDICES INSIDE IT
  10991.     N=N+1
  10992.     GOTO 2097
  10993. 7902    CONTINUE
  10994.     IF(KSG.NE.0)NSG=-1
  10995.     FORM(110)=0
  10996.     IF(ICHAR(FORM(119)).NE.0)GOTO 7903
  10997. C LEAVE DISPLAY INDICATOR ALONE IF SET BUT SET VBL OTHERWISE.
  10998.     IVVVV=NSG*NXNUM
  10999.     FORM(119)=CHAR(IVVVV)
  11000. C SET NEG FOR DISPLAY OF FORMULA, NOT NUMBER. ALLOWS TEXT ENTRY.
  11001. C ASSUME FORMULA IF WE SEE + OR -
  11002. 7903    CONTINUE
  11003. C FORCE FORM TO FOLLOW EDITS EVEN IF FORMAT/TYPE PRESET.
  11004.     IVVVV=JCHAR(FORM(119))
  11005.     IF(IVVVV.NE.0)FORM(119)=CHAR(ISGN(IVVVV)*NXNUM)
  11006.     IF(NALF.LE.0)GOTO 6221
  11007.     CALL FVLDST(PROW,PCOL,FORM(119))
  11008. C ENCODE CELL NAMES PRIOR TO STORING
  11009.     CALL CA2E(FORM,FORM2)
  11010.     CALL WRKFIL(IRX,FORM2,1)
  11011. 6221    CONTINUE
  11012.     ASSIGN 7904 TO NBK
  11013.     GOTO 7905
  11014. C LOOK UP PROW, PCOL, LEAVE DISPLAY COORDS IN LR,LC
  11015. 7905    CONTINUE
  11016.     DO 7906 LA1=1,DRWV
  11017.     LR=LA1
  11018.     DO 7906 LA2=1,DCLV
  11019.     LC=LA2
  11020.     IF(NRDSP(LA1,LA2).EQ.PROW.AND.NCDSP(LA1,LA2).EQ.PCOL)GOTO7907
  11021. 7906    CONTINUE
  11022. C IF WE FALL OUT OF THE LOOP, WE DIDN'T FIND THE LOC; FLAG BY PUTTING 0'S.
  11023.     LR=0
  11024.     LC=0
  11025.     GOTO 7908
  11026. 7907    CONTINUE
  11027. C ARRIVE HERE ON SUCCESS. LR, LC ALL SET UP.
  11028. 7908    CONTINUE
  11029.     GOTO NBK,(7904,8901,8957)
  11030. 7904    CONTINUE
  11031.     IF(LR.EQ.0.OR.LC.EQ.0)GOTO 7901
  11032.     THISRW=LR
  11033.     THISCL=LC
  11034. C    ASCII 1,2,3,4 ARE VALUES 49,50,51,52 IN DECIMAL.
  11035.     LRO=1
  11036.     LCO=1
  11037.     ID1=NRDSP(1,1)
  11038.     ID2=NCDSP(1,1)
  11039.     IF(.NOT.(JMVFG.EQ.51.AND.THISRW.EQ.1))GOTO 7110
  11040. C MUST SCROLL LEFT
  11041.     IF(IDOL7.EQ.0)GOTO 7110
  11042.     IF(ID1.LE.1)GOTO 7110
  11043.     ID1=MAX0(1,ID1-DRWV+2)
  11044.     DROW=MAX0(1,DRWV-2)
  11045.     IQQ=1
  11046.     GOTO 7112
  11047. 7110    CONTINUE
  11048.     IF(JMVFG.EQ.51)THISRW=MAX0(1,(THISRW-1))
  11049.     IF(.NOT.(JMVFG.EQ.52.AND.THISRW.EQ.DRWV))GOTO 7116
  11050. C MUST SCROLL RIGHT
  11051.     IF(IDOL7.EQ.0)GOTO 7116
  11052.     DROW=3
  11053. C    ID1=MIN0(60,ID1+DRWV-MIN0(DRWV,2))
  11054.     ID1=ID1+DRWV-MIN0(DRWV,2)
  11055.     IQQ=1
  11056.     GOTO 7112
  11057. C 7112 FAKES OUT OA CALL TO SCROLL OVER.
  11058. 7116    CONTINUE
  11059.     IF(JMVFG.EQ.52)THISRW=MIN0((THISRW+1),DRWV)
  11060.     IF(.NOT.(JMVFG.EQ.49.AND.THISCL.EQ.1))GOTO 7117
  11061. C MUST SCROLL UP
  11062.     IF(IDOL7.EQ.0)GOTO 7117
  11063.     IF(ID2.LE.2)GOTO 7117
  11064.     DCOL=MAX0(1,DCLV-2)
  11065.     ID2=MAX0(2,ID2-DCLV+2)
  11066.     IQQ=1
  11067.     GOTO 7112
  11068. 7117    CONTINUE
  11069.     IF(JMVFG.EQ.49)THISCL=MAX0(1,(THISCL-1))
  11070.     IF(.NOT.(JMVFG.EQ.50.AND.THISCL.EQ.DCLV))GOTO 7118
  11071. C MUST SCROLL DOWN
  11072.     IF(IDOL7.EQ.0)GOTO 7118
  11073.     DCOL=3
  11074. C    ID2=MIN0(301,ID2+DCLV-MIN0(DCLV,2))
  11075.     ID2=ID2+DCLV-MIN0(DCLV,2)
  11076.     IQQ=1
  11077.     GOTO 7112
  11078. 7118    CONTINUE
  11079.     IF(JMVFG.EQ.50)THISCL=MIN0((THISCL+1),DCLV)
  11080.     DROW=THISRW
  11081.     DCOL=THISCL
  11082.     PROW=NRDSP(DROW,DCOL)
  11083.     PCOL=NCDSP(DROW,DCOL)
  11084. C FORCE REDO OF BOTH LAST AND NEW COLUMN BY DISPLAYER.
  11085.     DVS(LR,LC)=DVS(LR,LC)+.0000000057
  11086.     DVS(DROW,DCOL)=DVS(DROW,DCOL)+.000000062
  11087. 7901    GOTO 9990
  11088. 8000    IF(CMDLIN(1).NE.'M')GOTO 8001
  11089.     ICODE=1
  11090. C MACROCELL COMMAND IF MH (HIDE) OR MS (SHOW)
  11091.     IF(CMDLIN(2).EQ.'S')IDOL4=1
  11092.     IF(CMDLIN(2).EQ.'H')IDOL4=0
  11093.     IF(CMDLIN(2).EQ.'S'.OR.CMDLIN(2).EQ.'H')GOTO 9990
  11094.     IF(CMDLIN(2).NE.'D')GOTO 4401
  11095. C MD MODE COMMAND.
  11096. C  MDD=DISABLE 3D AND DISALLOW 3D VBL NAMES
  11097. C  MDN=NO 3D BUT ALLOW 3D VBL NAMES
  11098. C  MDE=ENABLE 3D. DON'T TRANSLATE VARIABLE NAMES
  11099. C  MDF=FORCE 3D, TRANSLATING VARIABLE NAMES
  11100. C    ALL THESE ALLOW 2 NUMBERS TO FOLLOW, BEING COLUMN AND
  11101. C    ROW DELTAS TO THE NEXT "PLANE".
  11102.     K3DFG=0
  11103.     IF(CMDLIN(3).EQ.'D')K3DFG=-2
  11104.     IF(CMDLIN(3).EQ.'N')K3DFG=0
  11105.     IF(CMDLIN(3).EQ.'E')K3DFG=1
  11106.     IF(CMDLIN(3).EQ.'F')K3DFG=999
  11107. C NOW GRAB ARGS IF ANY.
  11108. C USE INTERNAL PROCEDURE TO DECODE 2 NUMBERS STARTING AT CMDLIN(4)
  11109. C SKIP IF NEXT CHAR IS NOT NUMERIC.
  11110.     If(cmdlin(4).eq.' ')goto 4404
  11111.     IF(Ichar(CMDLIN(4)).LE.47.OR.
  11112.      1   Ichar(CMDLIN(4)).GT.57)GOTO 9990
  11113. 4404    continue
  11114.     ASSIGN 4402 TO KBACK
  11115.     GOTO 8132
  11116. 4402    CONTINUE
  11117.     IF(NCL.GE.0.AND.NCL.LT.Mrows)KCDELT=NCL
  11118.     IF(LCWID.GE.0.AND.LCWID.LT.Mcols)KRDELT=LCWID
  11119.     GOTO 9990
  11120. 4401    CONTINUE
  11121. C MOVE COMMAND
  11122. C M1,M2,M3,M4 MOTION DIRECTION IS U,D,L,R
  11123.     IVVV=ICHAR(CMDLIN(2))
  11124. C ALLOW M0 TO MEAN RESTORE PRIOR STATE OF AUTOMOVE AND
  11125. C SAVE CURRENT STATE AS NEW PRIOR ONE. M1 THRU M5 MEAN SET
  11126. C AUTOMOVE TO 1-5 (5=NO MOTION) AND SAVE OLD STATE AS LAST
  11127. C STATE.
  11128.     IF(CMDLIN(2).EQ.'0')IVVV=JMVOLD
  11129.     JMVOLD=JMVFG
  11130.     JMVFG=IVVV
  11131. C    JMVFG=ICHAR(CMDLIN(2))
  11132. C STORE CHARACTER AS MOVE FLAG
  11133.     GOTO 9990
  11134. 8001    IF(CMDLIN(1).NE.'D')GOTO 8002
  11135. C DISPLAY COMMANDS
  11136. C
  11137. C DISPLAY SORT
  11138. C DSRA 1
  11139. C DS = CONSTANT KEYWORD
  11140. C R/C=ROW/COL (DISPLAY COORD #S)
  11141. C A/D=ASCENDING/DESCENDING ORDER
  11142. C NUMBER= DISPLAY COORD ROW/COL # TO SORT ON.
  11143. C SORTS NUMERIC FIELDS ONLY.
  11144.     IF(CMDLIN(2).NE.'S')GOTO 1752
  11145.     ICODE=2
  11146. C MUST REDRAW. WE DO WHOLESALE RELOCATIONS OF THINGS HERE.
  11147. C FIRST GET ARGUMENTS
  11148.     LAA=6
  11149.     LBB=15
  11150.     CALL GN(LAA,LBB,NBR,CMDLIN)
  11151. C THIS EXTRACTS THE NUMBER OF ROW/COL TO USE.
  11152. C DEFAULT IS PHYS, COL, ASCENDING
  11153. C    IF(NBR.LE.0.OR.NBR.GT.MAX0(20,75))GOTO 9990
  11154.     IF(NBR.LE.0.OR.NBR.GT.75)GOTO 9990
  11155.     SSIGN=1.
  11156.     IF(CMDLIN(4).EQ.'D')SSIGN=-1.
  11157. C SSIGN USED TO CONTROL ASCENDING/DESCENDING SORT (MULTIPLY BY IT)
  11158. C GET LENGTH TO GO THRU IN SORT
  11159.     IF(CMDLIN(3).EQ.'C')IDELTA=DCLV-1
  11160.     IF(CMDLIN(3).EQ.'R')IDELTA=DRWV-1
  11161.     I1IN=0
  11162.     I2IN=1
  11163. C GET PHYSICAL COORDINATES OF ROW/COL WE'RE SORTING ON.
  11164.     IF(CMDLIN(3).EQ.'R')GOTO 6222
  11165.     ID1=NRDSP(NBR,1)
  11166.     ID2=NCDSP(NBR,1)
  11167.     GOTO 1753
  11168. 6222    CONTINUE
  11169.     ID1=NRDSP(1,NBR)
  11170.     ID2=NCDSP(1,NBR)
  11171.     I1IN=1
  11172.     I2IN=0
  11173. C HACK TO HANDLE ROW/COL ALIKE
  11174. 1753    CONTINUE
  11175.     IFLIP=0
  11176. C IFLIP = BUBBLESORT FLAG WE CHANGED SOMETHING
  11177. C (USE SIMPLE MINDED SMALL SORT. TOO MUCH OVHD FOR BETTER ONE...NO ROOM)
  11178.     ID1A=ID1
  11179.     ID2A=ID2
  11180. C IGNORE CASE OF IDELTA=0... SHOULDN'T BE ANY WAY FOR THAT TO HAPPEN
  11181.     DO 1754 IV=1,IDELTA
  11182. C SORT HERE. IFLIP=1 IF WE INVERT ANYTHING.
  11183. C JUST COMPARE XVBLS...
  11184. C NOTE WE ASSUME A "NORMAL" TYPE DISPLAY, JUST RESET PHYSICAL STUFF.
  11185.     CALL XVBLGT(ID1A,ID2A,XAC)
  11186.     CALL XVBLGT(ID1A+I1IN,ID2A+I2IN,XVBLS(1,1))
  11187.     IF(XAC*SSIGN.LE.XVBLS(1,1)*SSIGN)GOTO 1755
  11188. C FLIP ASSIGNMENTS
  11189. C FLIP XVBLS NUMBERS TOO TO MAINTAIN SORT. WE RECOMPUTE ANYWAY..
  11190.     CALL XVBLST(ID1A+I1IN,ID2A+I2IN,XAC)
  11191.     CALL XVBLST(ID1A,ID2A,XVBLS(1,1))
  11192.     IFLIP=1
  11193. C SWAP ASSIGNMENTS OF DISPLAY STUFF IF IN RANGE
  11194. C OPERATES LIKE A SORTED OA COMMAND
  11195. C CURRENT PHYSICAL ROW IS ID2A (1...RCL LIMITS)
  11196. C AND PHYS COL IS ID1A.
  11197. C    LDELTA=DRW-1
  11198.     LDELTA=19
  11199. C FOR REASSIGNMENT, ROLE OF I1IN,I2IN CAN BE REVERSED...
  11200.     ID1B=1
  11201. C NOTE DISPLAY ID2 IS 1 LESS THAN PHYSICAL ONE. (AC'S)
  11202.     ID2B=ID2A-1
  11203.     IF(ID2B.LE.0)GOTO 1754
  11204.     IF(CMDLIN(3).NE.'R')GOTO 1756
  11205. C ROW...
  11206. C    LDELTA=DCL-1
  11207.     LDELTA=74
  11208. C ID1 SAME AS DISPLAY COORDS
  11209.     ID1B=ID1A
  11210.     ID2B=1
  11211. 1756    CONTINUE
  11212.     DO 1757 IVV=1,LDELTA
  11213. C FLIP THE ROW/COL 1 ENTRY AT A TIME. JUST CHANGES ASSIGNMENTS.
  11214.     JD1=NRDSP(ID1B,ID2B)
  11215.     JD2=NCDSP(ID1B,ID2B)
  11216.     NRDSP(ID1B,ID2B)=NRDSP(ID1B+I1IN,ID2B+I2IN)
  11217.     NCDSP(ID1B,ID2B)=NCDSP(ID1B+I1IN,ID2B+I2IN)
  11218.     NRDSP(ID1B+I1IN,ID2B+I2IN)=JD1
  11219.     NCDSP(ID1B+I1IN,ID2B+I2IN)=JD2
  11220.     ID1B=ID1B+I2IN
  11221.     ID2B=ID2B+I1IN
  11222. 1757    CONTINUE
  11223. C WE CAN ALWAYS FLIP SINCE WE STAY ON DISPLAY SHEET.
  11224. 1755    CONTINUE
  11225.     ID1A=ID1A+I1IN
  11226.     ID2A=ID2A+I2IN
  11227. 1754    CONTINUE
  11228. C DONE 1 PASS. IF ANYTHING CHANGED, TRY AGAIN.
  11229.     IF(IFLIP.NE.0)GOTO 1753
  11230. C DONE SORT AT END
  11231.     GOTO 9990
  11232. 1752    CONTINUE
  11233. C
  11234.     IF(CMDLIN(2).NE.'L')GOTO 8101
  11235. C DL = DISPLAY LOCATE V1:V2 N:M
  11236.     ASSIGN 8103 TO IBACK
  11237.     GOTO 8104
  11238. C STRIP VARIABLE NAMES OFF CMD LINE STARTING AT POSITION 3
  11239. 8104    LA=3
  11240.     LE=98
  11241.     L1=0
  11242.     LPagmd=0
  11243.     LPag1=0
  11244.     LPag2=0
  11245.     CALL VARSCN(CMDLIN(1),LA,LE,LSTC,ID1A,ID2A,IVLD)
  11246.     L2=0
  11247. C L1,L2 = FLAGS VARIABLE 1,2 FOUND VALIDLY
  11248.     LA=LSTC+1
  11249.     LE=100-LA
  11250.     IF(LE.LE.0.OR.IVLD.LE.0)GOTO 8102
  11251.     L1=1
  11252.     lpag1=kpag
  11253.     IF(CMDLIN(LSTC).eq.'}')Lpagmd=1
  11254.     IF((CMDLIN(LSTC).NE.':').and.(Cmdlin(Lstc).ne.'}'))
  11255.      1   GOTO 8102
  11256.     IF(CMDLIN(LSTC).NE.':')GOTO 8102
  11257. C MUST SEE : BETWEEN NAMES. NO SPACES PERMITTED.
  11258.     CALL VARSCN(CMDLIN,LA,LE,LSTC,ID1B,ID2B,IVLD)
  11259.     IF(IVLD.LE.0)GOTO 8102
  11260.     lpag2=kpag
  11261.     L2=1
  11262. 8102    CONTINUE
  11263. C NOTE THAT LSTC RETURNS AS CHARACTER AFTER VARIABLE LAST GRABBED IN INPUT LINE.
  11264.     GOTO IBACK,(8103,8112,8121,8301,8953,8900)
  11265. C NOW PICK UP RN:M OR CN:M (R=ROW,C=COL)
  11266. 8103    CONTINUE
  11267.     IF(L1.LT.1)GOTO 8101
  11268. C INVALID UNLESS AT LEAST 1 VBL NAME SEEN.
  11269.     LA=LSTC+2
  11270.     RCF=0
  11271.     IF(CMDLIN(LSTC+1).EQ.'R')RCF=2
  11272.     IF(CMDLIN(LSTC+1).EQ.'C')RCF=1
  11273.     IF(RCF.EQ.0)GOTO 8101
  11274.     KM1=1
  11275.     CALL GN(KM1,LE,NUM1,CMDLIN(LA))
  11276.     IF(NUM1.EQ.0)GOTO 8101
  11277.     KKK=ICHAR(':')
  11278.     LE=INDX(CMDLIN(LA),KKK)
  11279.     NUM2=0
  11280.     IF(LE.GT.100)GOTO 8101
  11281.     LA=LA+LE
  11282.     KM1=1
  11283.     KM8=8
  11284.     CALL GN(KM1,KM8,NUM2,CMDLIN(LA))
  11285. C NOW NUM1,NUM2 ARE DESIRED ROW/COL RANGE. NOW SET UP DISPLAY.
  11286.     IF(NUM2.EQ.0.OR.NUM2.GT.75)GOTO 8101
  11287.     IF(NUM1.GT.20)GOTO 8101
  11288. C ILLEGAL ROW/COL IS A NO-GO.
  11289. C R N:M MEANS STARTING AT COL N ROW M GOING L TO R.
  11290. C C N:M MEANS DOWN STARTING THERE. DISPLAY COORDS ASSUMED.
  11291.     IF(ID1A.NE.ID1B.AND.ID2A.NE.ID2B)GOTO 8101
  11292. C ONLY HANDLE ROWS OR COLS, NOT DIAGONALS.
  11293. C MUST BE A PHYS MTX ROW OR COL.
  11294.     LRINC=0
  11295.     LCINC=0
  11296.     IF(RCF.EQ.1)LRINC=1
  11297.     IF(RCF.EQ.2)LCINC=1
  11298.     ASSIGN 8108 TO JBACK
  11299.     GOTO 8109
  11300. C COPY DATA
  11301. 8109    CONTINUE
  11302.     ICODE=6
  11303.     IDELT=1
  11304.     IF(L2.NE.0)IDELT=MAX0(IABS(ID1A-ID1B),IABS(ID2A-ID2B))+1
  11305.     I1IN=0
  11306.     I2IN=1
  11307.     IF(ID1A.EQ.ID1B)GOTO 8106
  11308.     I1IN=1
  11309.     I2IN=0
  11310. 8106    CONTINUE
  11311.     ID1=ID1A
  11312.     ID2=ID2A
  11313.     GOTO JBACK,(8108,8113,8122,8307,8954)
  11314. 8108    CONTINUE
  11315.     ICODE=1
  11316.     IR=NUM1
  11317.     IC=NUM2
  11318. C 1 DIM COPY OF DATA, FOR IDELT ELEMENTS.
  11319.     DO 8105 NM=1,IDELT
  11320. C CLAMP TO MAX DISPLAY ARRAY
  11321.     IF(IR.GT.20.OR.IC.GT.75)GOTO 8105
  11322.     NRDSP(IR,IC)=ID1
  11323.     NCDSP(IR,IC)=ID2
  11324.     DVS(IR,IC)=DVS(IR,IC)-1.E-14
  11325. C    THISRW=IR
  11326. C    THISCL=IC
  11327. C    JRX=(ID2-1)*60+ID1
  11328.     CALL REFLEC(ID2,ID1,JRX)
  11329.     CALL WRKFIL(JRX,FORM2,0)
  11330. C    READ(7'JRX)FORM2
  11331. C    DO 7104 N7=1,9
  11332. C7104    DFMTS(N7,IR,IC)=FORM2(N7+119)
  11333. C    DFMTS(10,IR,IC)=0
  11334.     IR=IR+LCINC
  11335.     IC=IC+LRINC
  11336. C NOTE REVERSAL FOR DISPLAY.
  11337.     ID1=ID1+I1IN
  11338.     ID2=ID2+I2IN
  11339. 8105    CONTINUE
  11340. 8101    CONTINUE
  11341.     IF(CMDLIN(2).NE.'F')GOTO 8111
  11342. C DF STUFF - SET FORMAT.
  11343.     ASSIGN 8112 TO IBACK
  11344.     GOTO 8104
  11345. 8112    CONTINUE
  11346. C NOW HAVE VARIABLE ID'S SET UP
  11347.     IF(L1.LE.0)GOTO 8120
  11348. C MUST HAVE 1 OR MORE...
  11349.     ASSIGN 8113 TO JBACK
  11350.     GOTO 8109
  11351. C IDELT NOW SET UP. SET FORMATS UP NOW.
  11352. C FORMATS ARE IN [] BRACKETS. FIND THESE AND USE.
  11353. 8113    CONTINUE
  11354.     ICODE=1
  11355.     KKK=ICHAR('[')
  11356.     LA=INDX(CMDLIN,KKK)+1
  11357.     KKK=ICHAR(']')
  11358.     LB=INDX(CMDLIN,KKK)-1
  11359.     LDELT=LB-LA+1
  11360.     LDELT=MIN0(LDELT,9)
  11361.     DO 8114 LN=1,IDELT
  11362. C IDELT IS OVER VRBL LIST GIVEN. MAY BE 1 ONLY.
  11363. C    IRRX=(ID2-1)*60+ID1
  11364.     CALL REFLEC(ID2,ID1,IRRX)
  11365.     CALL WRKFIL(IRRX,FORM,0)
  11366. C    READ(7'IRRX)FORM
  11367.     IF(CMDLIN(LA).EQ.'*')GOTO 7115
  11368.     IF(CMDLIN(LA).EQ.'A'.OR.CMDLIN(LA).EQ.'L')GOTO 7115
  11369. C KEEP EXISTING FORMAT IF [*] IS USED.
  11370.     DO 7989 KKKK=1,9
  11371. 7989    FORM(119+KKKK)=Char(0)
  11372.     DO 8115 LNA=1,LDELT
  11373.     FORM(LNA+119)=CMDLIN(LA-1+LNA)
  11374.     IF(LNA.LT.9)FORM(LNA+120)=0
  11375. 8115    CONTINUE
  11376. 7115    CONTINUE
  11377. C    FORM(128)=0
  11378.     CALL FVLDGT(ID1,ID2,FVWRK)
  11379.     IVVVV=JCHAR(FVWRK)
  11380.     IF(IVVVV.EQ.0)IVVVV=3
  11381. C SET UP DEFAULT AS NUMERIC.
  11382. C    IVVVV=FVLD(ID1,ID2)
  11383. C    FVLD(ID1,ID2)=MAX0(1,IABS(IVVVV))
  11384.     IVVVV=MAX0(1,IABS(IVVVV))
  11385.     IF(CMDLIN(LA).EQ.'A'.OR.CMDLIN(LA).EQ.'L')IVVVV=
  11386.      1  MIN0(-1,-IABS(IVVVV))
  11387.     CALL FVLDST(ID1,ID2,CHAR(IVVVV))
  11388.     IF(CMDLIN(LA).EQ.'I')CALL TYPSET(ID1,ID2,4)
  11389.     IF(CMDLIN(LA).EQ.'F'.OR.CMDLIN(LA).EQ.'E')
  11390.      1   CALL TYPSET(ID1,ID2,2)
  11391.     FORM(119)=CHAR(IVVVV)
  11392. C
  11393. C TO BE SURE WE DON'T FOUL UP THE FILE, TRY AN ENCODE ON THIS FORMAT
  11394. C PRIOR TO THE WRITE. THAT WAY IF WE BOMB, THE FILE WE HAVE DIRECT ACCESS
  11395. C DATA ON IS NOT CLOBBERED.
  11396.     IF(IVVVV.LE.0)GOTO 7990
  11397.     DO 7988 KKK=1,9
  11398.     KKKK=ICHAR(FORM(119+KKK))
  11399. 7988    DFE(KKK+1)=CHAR(MAX0(32,KKKK))
  11400.     DFE(1)='('
  11401.     DFE(12)=' '
  11402.     DFE(13)=' '
  11403.     DFE(14)=')'
  11404.     CALL TYPGET(N1,N2,TYPE(1,1))
  11405.     CALL FVLDGT(N1,N2,FVLD(1,1))
  11406.     IF(JCHAR(FVLD(1,1)).LE.0)GOTO 7990
  11407.     IF(TYPE(1,1).NE.2)GOTO 6223
  11408.     WRITE(WRKCHR(1:127),DFE,ERR=4302)DVS(THISRW,THISCL)
  11409.     GOTO 7990
  11410. 6223    CONTINUE
  11411.         WRITE(WRKCHR(1:127),DFE,ERR=4302)LDVS(1,THISRW,THISCL)
  11412. 7990    CONTINUE
  11413.     CALL WRKFIL(IRRX,FORM,1)
  11414.     DO 8116 NX1=1,20
  11415.     DO 8116 NX2=1,75
  11416. C LOCATE DISPLAY CELL IF ANY
  11417.     IF(NRDSP(NX1,NX2).EQ.ID1.AND.NCDSP(NX1,NX2).EQ.ID2)GOTO 8117
  11418. 8116    CONTINUE
  11419.     GOTO 8118
  11420. 8117    CONTINUE
  11421.     DVS(NX1,NX2)=DVS(NX1,NX2)-1.23E-12
  11422. 8118    CONTINUE
  11423.     ID1=ID1+I1IN
  11424.     ID2=ID2+I2IN
  11425. 8114    CONTINUE
  11426. 8111    CONTINUE
  11427.     IF(CMDLIN(2).NE.'T')GOTO 8120
  11428. C DT DISPLAY TYPE
  11429.     ASSIGN 8121 TO IBACK
  11430.     GOTO 8104
  11431. C GET VBL NAMES
  11432. 8121    ASSIGN 8122 TO JBACK
  11433.     GOTO 8109
  11434. 8122    LA=LSTC+1
  11435.     IF(L1.LE.0)GOTO 8120
  11436.     KTYP=2
  11437.     IF(CMDLIN(LA).EQ.'I')KTYP=4
  11438.     ICODE=1
  11439.     DO 8123 LNA=1,IDELT
  11440.     CALL TYPSET(ID1,ID2,KTYP)
  11441. C    TYPE(ID1,ID2)=KTYP
  11442.     DO 8126 NX1=1,DRWV
  11443.     DO 8126 NX2=1,DCLV
  11444.     IF(NRDSP(NX1,NX2).EQ.ID1.AND.NCDSP(NX1,NX2).EQ.ID2)GOTO 8127
  11445. C FIND DISPLAY LOC IF ANY AND SET IT UP FOR REDRAW
  11446. 8126    CONTINUE
  11447.     GOTO 8128
  11448. 8127    CONTINUE
  11449.     DVS(NX1,NX2)=DVS(NX1,NX2)-1.211E-16
  11450. 8128    CONTINUE
  11451.     ID1=ID1+I1IN
  11452.     ID2=ID2+I2IN
  11453. 8123    CONTINUE
  11454. 8120    CONTINUE
  11455.     IF(CMDLIN(2).NE.'W')GOTO 8130
  11456. C DW SETS COL WIDTH
  11457.     ASSIGN 8131 TO KBACK
  11458.     GOTO 8132
  11459. C GET 2 NUMBERS STARTING AT CMDLIN(4)
  11460. 8132    CONTINUE
  11461.     KM1=1
  11462.     KM6=6
  11463.     CALL GN(KM1,KM6,NCL,CMDLIN(4))
  11464.     KKK=ICHAR(',')
  11465.     LA=INDX(CMDLIN(4),KKK)
  11466. C COMMA MUST BE SEPARATOR
  11467.     LCWID=7
  11468.     IF(LA.GT.100)GOTO 8138
  11469.     KM1=1
  11470.     CALL GN(KM1,KM6,LCWID,CMDLIN(LA+4))
  11471. 8138    GOTO KBACK,(8131,8141,4402)
  11472. 8131    CONTINUE
  11473.     ICODE=6
  11474.     NCL=MAX0(1,NCL)
  11475.     NCL=MIN0(NCL,20)
  11476.     LCWID=MAX0(1,LCWID)
  11477.     LCWID=MIN0(LCWID,110)
  11478. C COL WIDTH IS 3 TO 110 CHARS.
  11479.     IF(NCL.GT.0)CWIDS(NCL)=LCWID
  11480. 8133    CONTINUE
  11481. 8130    CONTINUE
  11482.     IF(CMDLIN(2).NE.'B')GOTO 8140
  11483. C DB = BOUNDS ON ROW,COL
  11484.     ASSIGN 8141 TO KBACK
  11485.     GOTO 8132
  11486. C PARASITE OTHER CODE TO GET DIGITS
  11487. 8141    MC=NCL
  11488.     MR=LCWID
  11489.     MC=MIN0(MC,20)
  11490.     MR=MIN0(MR,75)
  11491. C CLAMP RANGE TO LEGAL
  11492.     IF(MC.GT.0)DRWV=MC
  11493.     IF(MR.GT.0)DCLV=MR
  11494.     ICODE=2
  11495. C REDRAW SCREEN WHEN BOUNDS CHANGE.
  11496. 8140    CONTINUE
  11497.     GOTO 9990
  11498. 8002    IF(CMDLIN(1).NE.'V')GOTO 8003
  11499. C VIEW REDRAW COMMAND
  11500.     IF(CMDLIN(2).EQ.'C'.OR.CMDLIN(2).EQ.'B')CALL SWSET(0)
  11501.     IF(CMDLIN(2).EQ.'I')CALL SWSET(1)
  11502.     IF(CMDLIN(2).EQ.'C'.OR.CMDLIN(2).EQ.'B')MODFLG=0
  11503.     IF(CMDLIN(2).EQ.'I')MODFLG=1
  11504. C VI MEANS VIEW IBM MODE, USING BIOS CALLS FOR DIRECT SCREEN OUTPUT.
  11505.     IF(CMDLIN(2).EQ.'C')CALL UVT100(20,0,0)
  11506.     IF(CMDLIN(2).EQ.'B')CALL UVT100(21,0,0)
  11507. C VC SETS VIEW COLOR MODE
  11508. C VB SETS VIEW B+W MODE
  11509. C REQUIRES UVTGEN MODULE...
  11510.     IF(CMDLIN(2).EQ.'H')GOTO 8320
  11511. 8324    CONTINUE
  11512.     PZAP=0
  11513.     FORMFG=0
  11514.     IF(CMDLIN(2).EQ.'F')FORMFG=1
  11515.     IF(CMDLIN(2).EQ.'M')PZAP=1
  11516.     ICODE=6
  11517.     IF(CMDLIN(2).EQ.'E')ICODE=1
  11518. C VE JUST TURNS ON VIEW MODE, DOESN'T REPAINT ALL.
  11519.     GOTO 9990
  11520. 8320    CONTINUE
  11521.     IF(CMDLIN(3).NE.'+'.AND.CMDLIN(3).NE.'-')GOTO 8324
  11522. C VH+ OR VH-, FLIP VIEW HACK TO SHOW PROGRESS
  11523. C DYMANICALLY
  11524.     IDOL8=1
  11525.     IF(CMDLIN(3).EQ.'-')IDOL8=0
  11526. C IDOL8 = 1 MEANS DO THE DISPLAY, 0 MEANS DON'T.
  11527.     ICODE=3
  11528.     GOTO 9990
  11529. 8003    IF(CMDLIN(1).NE.'C'.AND.CMDLIN(1).NE.'I')GOTO 8004
  11530. C COPY NUMBERS COMMAND
  11531. C COPY (NUMBERS,FORMAT,DISPLAY,ALL)
  11532. C CV=COPY VALUE, CD=COPY DISPLAY FMT, CF=COPY FORMULA, CA=COPY ALL
  11533. C Ca V1:V2 V3:V4 COPIES FIRST RANGE TO SECOND.
  11534. C IR RANGES DOES INPLACE RELOCATION...
  11535. C
  11536. C COLLECT ARGS
  11537.     ASSIGN 8301 TO IBACK
  11538.     GOTO 8104
  11539. 8301    CONTINUE
  11540. C NOW L1,L2 SAY IF VBLS(ID1A,ID2A) AND (ID1B,ID2B) EXIST
  11541. C also Lpagmd says if the first range is page range and
  11542. C Lpag1 and Lpag2 have page ranges.
  11543. C COLLECT JD2A,JD2B. USE SIMILAR INTERNAL PROCEDURE CODE.
  11544.     IF(L1.LE.0)GOTO 8399
  11545.     ASSIGN 8302 TO MBACK
  11546.     GOTO 8303
  11547. 8303    CONTINUE
  11548. C COLLECT 2 VARS STARTING AT LSTC+3
  11549. C SKIPS LSTC DELIMITER.
  11550.     LJ1=0
  11551.     LJ2=0
  11552.     LA=LSTC+1
  11553.     LE=110-LA
  11554.     KPagmd=0
  11555.     KPag1=0
  11556.     KPag2=0
  11557.     IF(LE.LE.0)GOTO 8304
  11558.     CALL VARSCN(CMDLIN,LA,LE,LSTC,JD1A,JD1B,IVLD)
  11559.     LA=LSTC+1
  11560.     LE=110-LA
  11561.     IF(LE.LE.0.OR.IVLD.LE.0)GOTO 8304
  11562.     KPag1=kpag
  11563.     LJ1=1
  11564. C allow } to indicate DEPTH oriented ranges but flag it.
  11565.     If(Cmdlin(lstc).eq.'}')KPagmd=1
  11566.     IF((CMDLIN(LSTC).NE.':').and.(Cmdlin(Lstc).ne.'}'))
  11567.      1    GOTO 8304
  11568.     CALL VARSCN(CMDLIN,LA,LE,LSTC,JD2A,JD2B,IVLD)
  11569.     IF(IVLD.LE.0)GOTO 8304
  11570.     KPag2=kpag
  11571.     LJ2=1
  11572. 8304    GOTO MBACK,(8302)
  11573. 8302    CONTINUE
  11574.     IF(LJ1.LE.0)GOTO 8399
  11575.     IDELT=1
  11576.     IPDL=0
  11577.     If(LPagmd.ne.0.and.Lpag2.gt.LPag1)ipdl=Lpag2-Lpag1
  11578.     If(K3Dfg.le.0)ipdl=0
  11579.     IF(L2.NE.0.AND.(ID1A.NE.ID1B.AND.ID2A.NE.ID2B))GOTO 8305
  11580.     IF(L2.NE.0)IDELT=MAX0(IABS(ID1A-ID1B),IABS(ID2A-ID2B),
  11581.      1   IPDL)+1
  11582.     if(k3dfg.gt.0.and.lpagmd.ne.0.and.ipdl.gt.0)
  11583.      1  idelt=ipdl+1
  11584.     IKDelt=IDelt
  11585. 8305    CONTINUE
  11586.     JDELT=1
  11587.     JPDL=0
  11588.     If(KPagmd.ne.0.and.Kpag2.gt.KPag1)JPDL=KPag2-KPag1
  11589.     If(K3Dfg.le.0)jpdl=0
  11590.     IF(LJ2.EQ.0)GOTO 8306
  11591.     IF(JD1A.NE.JD2A.AND.JD1B.NE.JD2B)GOTO 8306
  11592.     JDELT=MAX0(IABS(JD1A-JD2A),IABS(JD1B-JD2B),
  11593.      1    JPDL)+1
  11594. 8306    IF(L2.NE.0)JDELT=MIN0(IDELT,JDELT)
  11595. C For page mode, difference is depth, not row or cols.
  11596.     if(k3dfg.gt.0.and.kpagmd.ne.0.and.jpdl.gt.0)
  11597.      1  jdelt=jpdl+1
  11598. C CHANGE FOR REPLICATE :  JDELT CAN BE JUST JDELT IF L2=0
  11599.     ASSIGN 8307 TO JBACK
  11600. C 8109 IS WHERE WE SET UP I1IN AND I2IN ASSUMING THAT THE VARIABLES
  11601. C ARE SET PROPERLY. HANDLED AS AN INTERNAL PROCEDURE.
  11602.     GOTO 8109
  11603. 8307    CONTINUE
  11604. C 8109 procedure also resets IDELT
  11605.     If(k3dfg.gt.0)IDelt=IKDelt
  11606.     JIN1=1
  11607.     JIN2=0
  11608.     IF(JD1B.EQ.JD2B)GOTO 8308
  11609.     JIN1=0
  11610.     JIN2=1
  11611. 8308    CONTINUE
  11612. C
  11613. C Change for 3D depth ranges:
  11614. C Reset I1IN and I2IN to KRDELT and KCDELT if depth mode and
  11615. C 3D stuff enabled. Reset JIN1 and JIN2 likewise if depth
  11616. C mode there.
  11617. C This has the advantage that it allows cells to be copied
  11618. C from any one dimensional range to any other, even if one
  11619. C or both 1-D ranges are in depth. A certain amount of hacking
  11620. C can allow cells possibly to be copied in overlapping pages
  11621. C also (for stuff like matrix traces).
  11622.     If(K3DFG.LE.0)goto 8610
  11623.     If(LPagmd.le.0)goto 8611
  11624.     I1IN=KCDELT
  11625.     I2IN=KRDELT
  11626. 8611    Continue
  11627.     If(KPagmd.le.0)goto 8610
  11628.     JIN1=KCDELT
  11629.     JIN2=KRDELT
  11630. 8610    Continue
  11631. C CHANGE FOR REPLICATE: IF L2 IS 0 (NO 2ND SRC VARIABLE), NO BUMPS
  11632. C PAST THE SINGLE VARIABLE SPECIFIED.
  11633.     IF(L2.EQ.0)I1IN=0
  11634.     IF(L2.EQ.0)I2IN=0
  11635. C FOR PCC-PC DO RECALC ALWAYS TO ALLOW DISPLAY TO LOOK OK
  11636.     ICODE=3
  11637. C    ICODE=1
  11638. C FORCE RECALC IF ONLY 1 SOURCE VARIABLE.
  11639. C    IF(L2.EQ.0)ICODE=3
  11640.     JRTR=PROW
  11641.     JRTC=PCOL
  11642. C JRTR AND JRTC = RELOCATION THRESHOLDS
  11643. C CELLS ABOVE OR LEFT OF JRTR,JRTC WILL NOT BE RELOCATED IN A CR
  11644. C OPERATION. THIS WILL GENERALLY BE THE PHYSICAL COLUMN OR ROW
  11645. C OF THE CURRENT POSITION. CELLS LOWER OR EQUAL, OR TO THE RIGHT
  11646. C OF THE CURRENT LOCATION OR EQUAL, WILL BE RELOCATED. (VARIABLE
  11647. C NAMES GET EDITED)
  11648.     ASSIGN 8365 TO KPYBAK
  11649.     GOTO 8364
  11650. C 8364 BEGINS COPY PROCEDURE SECTION
  11651. C GOES FOR JDELT CELLS WITH I1IN AND I2IN BEING SOURCE INCREMENTS FOR
  11652. C RRW DIMENSION, RCL DIMENSION, AND JIN1,2 BEING INCREMENTS FOR
  11653. C DESTINATION RRW,RCL DIMENSIONS RESPECTIVELY. USES CMDLIN(2) TO
  11654. C FLAG WHETHER TO HANDLE ALL, JUST FORMAT, RELOCATE, ETC.
  11655. C  ALSO ID1A,ID2A ARE START SOURCE LOCATION
  11656. C  JD1A,JD1B = DEST START LOCATION.
  11657. C
  11658. C COPIES 1 ROW OR COLUMN AT A TIME.
  11659. 8364    CONTINUE
  11660. C    ICODE=1
  11661. C SET DISPLAY UPDATE ON COPIED CELLS
  11662. CCD    DO 3620 JV=1,BRRCL
  11663. CCD3620    IBITMP(JV)=0
  11664.     DO 8309 JV=1,JDELT
  11665.     DO 8380 NX1=1,DRWV
  11666.     DO 8380 NX2=1,DCLV
  11667. C LOCATE DISPLAY CELL IF ANY
  11668.     IF(NRDSP(NX1,NX2).EQ.ID1.AND.NCDSP(NX1,NX2).EQ.ID2)GOTO 8387
  11669. 8380    CONTINUE
  11670.     GOTO 8388
  11671. 8387    CONTINUE
  11672.     DVS(NX1,NX2)=DVS(NX1,NX2)+1.245E-14
  11673. 8388    CONTINUE
  11674. C    JRXX=(JD1B-1)*60+JD1A
  11675. C    IRXX=(ID2A-1)*60+ID1A
  11676.     CALL REFLEC(JD1B,JD1A,JRXX)
  11677.     CALL REFLEC(ID2A,ID1A,IRXX)
  11678.     CALL FVLDGT(ID1A,ID2A,FVLD(1,1))
  11679.     KKKKK=JCHAR(FVLD(1,1))
  11680.     CALL FVLDGT(JD1A,JD1B,FVLD(1,1))
  11681.     IF(KKKKK.EQ.0.AND.ICHAR(FVLD(1,1)).EQ.0)GOTO 8314
  11682. C    IF(FVLD(ID1A,ID2A).EQ.0.AND.FVLD(JD1A,JD1B).EQ.0)GOTO 8314
  11683.     CALL WRKFIL(IRXX,FORM,0)
  11684.     CALL WRKFIL(JRXX,FORM2,0)
  11685.     IF(KKKKK.EQ.-2)CALL FVLDST(ID1A,ID2A,CHAR(253))
  11686.     IF(KKKKK.EQ.2)CALL FVLDST(ID1A,ID2A,CHAR(3))
  11687.     IF(jchar(FORM (119)).EQ. 2)FORM (119)=Char(3)
  11688.     IF(jchar(FORM (119)).EQ.-2)FORM (119)=Char(253)
  11689.     IF(jchar(FORM2(119)).EQ. 2)FORM2(119)=Char(3)
  11690.     IF(jchar(FORM2(119)).EQ.-2)FORM2(119)=Char(253)
  11691.     IF(CMDLIN(2).NE.'R'.AND.CMDLIN(2).NE.'A')GOTO 8310
  11692.     IF(CMDLIN(2).NE.'R')GOTO 8366
  11693. C RELOCATE, THEN WRITE NEW CELL
  11694.     II1=ID1A
  11695.     II2=ID2A
  11696.     JJ1=JD1A
  11697.     JJ2=JD1B
  11698.     CALL RELVBL(FORM,FORM2,II1,II2,JJ1,JJ2,JRTR,JRTC)
  11699. C THE ABOVE WILL RELOCATE FORM INTO FORM2 WHICH WE NOW EMIT.
  11700. C ALLOW IR COMMAND TO DO INPLACE RELOCATION.
  11701.     IF(CMDLIN(1).NE.'I')GOTO 6224
  11702.     CALL WRKFIL(IRXX,FORM2,1)
  11703.     GOTO 9222
  11704. 6224    CONTINUE
  11705.     CALL WRKFIL(JRXX,FORM2,1)
  11706.     GOTO 8367
  11707. 8366    CONTINUE
  11708.     CALL WRKFIL(JRXX,FORM,1)
  11709. C    WRITE(7'JRXX)FORM
  11710. 8367    CONTINUE
  11711.     CALL TYPGET(ID1A,ID2A,TYPE(1,1))
  11712.     CALL TYPSET(JD1A,JD1B,TYPE(1,1))
  11713. C    TYPE(JD1A,JD1B)=TYPE(ID1A,ID2A)
  11714.     CALL XVBLGT(ID1A,ID2A,XVBLS(1,1))
  11715.     CALL XVBLST(JD1A,JD1B,XVBLS(1,1))
  11716. C    XVBLS(JD1A,JD1B)=XVBLS(ID1A,ID2A)
  11717.     CALL FVLDGT(ID1A,ID2A,FVLD(1,1))
  11718.     CALL FVLDST(JD1A,JD1B,FVLD(1,1))
  11719. C    FVLD(JD1A,JD1B)=FVLD(ID1A,ID2A)
  11720. 9222    ID1A=ID1A+I1IN
  11721.     ID2A=ID2A+I2IN
  11722.     JD1A=JD1A+JIN1
  11723.     JD1B=JD1B+JIN2
  11724.     GOTO 8309
  11725. 8310    CONTINUE
  11726.     IF(CMDLIN(2).NE.'V')GOTO 8312
  11727.     CALL TYPGET(ID1A,ID2A,TYPE(1,1))
  11728.     CALL TYPSET(JD1A,JD1B,TYPE(1,1))
  11729. C    TYPE(JD1A,JD1B)=TYPE(ID1A,ID2A)
  11730.     CALL XVBLGT(ID1A,ID2A,XVBLS(1,1))
  11731.     CALL XVBLST(JD1A,JD1B,XVBLS(1,1))
  11732. C    XVBLS(JD1A,JD1B)=XVBLS(ID1A,ID2A)
  11733. 8312    IF(CMDLIN(2).NE.'D')GOTO 8313
  11734.     CALL FVLDGT(ID1A,ID2A,FVLD(1,1))
  11735.     CALL FVLDST(JD1A,JD1B,FVLD(1,1))
  11736. C    FVLD(JD1A,JD1B)=FVLD(ID1A,ID2A)
  11737.     DO 8315 LXQ=1,10
  11738. 8315    FORM2(118+LXQ)=FORM(118+LXQ)
  11739.     CALL WRKFIL(JRXX,FORM2,1)
  11740. C    WRITE(7'JRXX)FORM2
  11741. 8313    IF(CMDLIN(2).NE.'F')GOTO 8314
  11742.     DO 8316 LXQ=1,110
  11743. 8316    FORM2(LXQ)=FORM(LXQ)
  11744.     CALL WRKFIL(JRXX,FORM2,1)
  11745. 8314    CONTINUE
  11746.     ID1A=ID1A+I1IN
  11747.     ID2A=ID2A+I2IN
  11748.     JD1A=JD1A+JIN1
  11749.     JD1B=JD1B+JIN2
  11750. 8309    CONTINUE
  11751. C RETURN POINT FROM COPY LOOP IN NORMAL COPY
  11752.     GOTO KPYBAK,(8840,8836,8365)
  11753. 8365    CONTINUE
  11754. 8399    GOTO 9990
  11755. 8004    IF(CMDLIN(1).LT.'1'.OR.CMDLIN(1).GT.'4')GOTO 8005
  11756. C 1,2,3,4 POSITIONING COMMANDS
  11757. C USE LLT AND LGT LEXICAL ORDERING TESTS, NOT ARITHMETIC ONES...
  11758.     ICODE=5
  11759. C    IF(CMDLIN(1).EQ.'3')THISRW=MAX0(1,(THISRW-1))
  11760. C    IF(CMDLIN(1).EQ.'4')THISRW=MIN0((THISRW+1),DRWV)
  11761. C    IF(CMDLIN(1).EQ.'1')THISCL=MAX0(1,(THISCL-1))
  11762. C    IF(CMDLIN(1).EQ.'2')THISCL=MIN0((THISCL+1),DCLV)
  11763. C COULD ADD SCROLLING HERE IF DESIRED.
  11764. C    ASCII 1,2,3,4 ARE VALUES 49,50,51,52 IN DECIMAL.
  11765.     MVFG=ICHAR(CMDLIN(1))
  11766.     LRO=1
  11767.     LCO=1
  11768.     ID1=NRDSP(1,1)
  11769.     ID2=NCDSP(1,1)
  11770.     IF(.NOT.(MVFG.EQ.51.AND.THISRW.EQ.1))GOTO 2110
  11771. C MUST SCROLL LEFT
  11772.     IF(IDOL7.EQ.0)GOTO 2110
  11773.     IF(ID1.LE.1)GOTO 2110
  11774.     ID1=MAX0(1,ID1-DRWV+2)
  11775.     DROW=MAX0(1,DRWV-2)
  11776.     IQQ=1
  11777.     GOTO 7112
  11778. 2110    IF(MVFG.EQ.51)THISRW=MAX0(1,(THISRW-1))
  11779.     IF(.NOT.(MVFG.EQ.52.AND.THISRW.EQ.DRWV))GOTO 2116
  11780. C MUST SCROLL RIGHT
  11781.     IF(IDOL7.EQ.0)GOTO 2116
  11782.     DROW=3
  11783. C    ID1=MIN0(60,ID1+DRWV-MIN0(DRWV,2))
  11784.     ID1=ID1+DRWV-MIN0(DRWV,2)
  11785.     IQQ=1
  11786.     GOTO 7112
  11787. C 7112 FAKES OUT OA CALL TO SCROLL OVER.
  11788. 2116    IF(MVFG.EQ.52)THISRW=MIN0((THISRW+1),DRWV)
  11789.     IF(.NOT.(MVFG.EQ.49.AND.THISCL.EQ.1))GOTO 2117
  11790. C MUST SCROLL UP
  11791.     IF(IDOL7.EQ.0)GOTO 2117
  11792.     IF(ID2.LE.2)GOTO 2117
  11793.     DCOL=MAX0(1,DCLV-2)
  11794.     ID2=MAX0(2,ID2-DCLV+2)
  11795.     IQQ=1
  11796.     GOTO 7112
  11797. 2117    IF(MVFG.EQ.49)THISCL=MAX0(1,(THISCL-1))
  11798.     IF(.NOT.(MVFG.EQ.50.AND.THISCL.EQ.DCLV))GOTO 2118
  11799. C MUST SCROLL DOWN
  11800.     IF(IDOL7.EQ.0)GOTO 2118
  11801.     DCOL=3
  11802. C    ID2=MIN0(301,ID2+DCLV-MIN0(DCLV,2))
  11803.     ID2=ID2+DCLV-MIN0(DCLV,2)
  11804.     IQQ=1
  11805.     GOTO 7112
  11806. 2118    IF(MVFG.EQ.50)THISCL=MIN0((THISCL+1),DCLV)
  11807.     PROW=NRDSP(THISRW,THISCL)
  11808.     PCOL=NCDSP(THISRW,THISCL)
  11809.     DROW=THISRW
  11810.     DCOL=THISCL
  11811.     GOTO 9990
  11812. 8005    CONTINUE
  11813. 8007    IF(CMDLIN(1).NE.'R')GOTO 8008
  11814.     IF(CMDLIN(2).NE.'B')GOTO 7333
  11815. C RB VAR SETS RELOCATE BOUNDARY TO VAR COORDS
  11816.     IF(CMDLIN(3).EQ.'*')GOTO 7332
  11817. C NORMAL RB COMMAND
  11818. C RB VAR USES VAR NAME TO RESET BDY
  11819.     LO=3
  11820.     KKKK=20
  11821.     CALL VARSCN(CMDLIN,LO,KKKK,IV,ID1,ID2,IVALID)
  11822.     IF(IVALID.LE.0)GOTO 9990
  11823. C IGNORE ERRORS
  11824.     IDOL5=ID1
  11825.     IDOL6=ID2
  11826.     GOTO 9990
  11827. 7332    IDOL5=20000
  11828.     IDOL6=20000
  11829. C RB* RESETS RELOCATE BDY TO END OF SHEET
  11830.     GOTO 9990
  11831. 7333    CONTINUE
  11832. C RECOMPUTE SHEET.
  11833. C RM COMMAND SETS MANUAL FLAG.
  11834.     RCFGX=0
  11835. c
  11836.     RCONE=0
  11837.     IF(CMDLIN(2).NE.'S')GOTO 5114
  11838.     RRWACT=MCols
  11839.     RCLACT=MRows
  11840. 5114    CONTINUE
  11841. C RCFGX NONZERO INHIBITS RECALCULATION.
  11842. C RCONE SET 1 TO FORCE RECALC OF ALL.
  11843. C CHANGE FROM OTHER SYNTAX: RF FORCES RECALC, R DOES NOT.
  11844.     IF(CMDLIN(2).EQ.'F'.OR.CMDLIN(2).EQ.'R')RCONE=1
  11845. C NOTE RXF (X=ANY CHAR BUT F) ACTS LIKE OLD VERSION RXF.
  11846. C BARE R COMMAND HOWEVER JUST REDOES CALC. F NOW MEANS "FORCE"
  11847. C AND SEEMS A BIT MORE MNEMONIC THIS WAY. ALLOW RR COMMAND
  11848. C TO WORK AS WELL AS RF.
  11849.     IF(CMDLIN(2).NE.'R')RCMODE=0
  11850.     IF(CMDLIN(2).EQ.'E')RCMODE=1
  11851.     IF(CMDLIN(2).EQ.'I')RCMODE=2
  11852. C RE, RI MODE CONTROLS... ALSO RR ACTS LIKE RF BUT STAYS IN
  11853. C RE OR RI MODE... RECALC ENTRY OR INCREMENTAL...
  11854.     IF(CMDLIN(2).EQ.'M')RCFGX=1
  11855.     ICODE=3
  11856. C 3rd char I Inhibits recalc this time but sets modes...
  11857.     IF(CMDLIN(3).EQ.'I')ICODE=1
  11858.     GOTO 9990
  11859. 8008    IF(CMDLIN(1).NE.'K')GOTO 8009
  11860. C DROP INTO CALC BARE.
  11861.     IF(IPSET.NE.0)GOTO 9990
  11862. C CAN'T CALL CALC RECURSIVELY
  11863.     OSWIT=0
  11864.     ILNFG=0
  11865. C    ICODE=-1
  11866. C CLOSE UNIT 1 JUST IN CASE...
  11867.     CLOSE(1)
  11868.     CALL UVT100(11,2,0)
  11869. C ERASE DSPLY
  11870.     KLVL=1
  11871.     ILNCT=0
  11872. C ICODE SET TO 420 SPECIAL CODE TO TELL MAIN PGM TO CALL INTERACTIVE
  11873. C CALCULATOR FCN.
  11874.     ICODE=420
  11875.     GOTO 9990
  11876. 8009    IF(CMDLIN(1).NE.'L')GOTO 8010
  11877. C LOCATE CURSOR ORIGIN
  11878. C FORMAT IS L VARIABLE
  11879. C ONLY 1 VARIABLE NAME TO BE ENTERED.
  11880.     LA=2
  11881.     LE=30
  11882.     CALL VARSCN(CMDLIN,LA,LE,LSTC,ID1A,ID2A,IVLD)
  11883.     L1=IVLD
  11884. C    ASSIGN 8900 TO IBACK
  11885. C    GOTO 8104
  11886. 8900    IF(L1.LT.1)GOTO 9990
  11887. 3800    PROW=ID1A
  11888.     PCOL=ID2A
  11889. C LOOK UP DISPLAY COORDS IF ANY
  11890.     ASSIGN 8901 TO NBK
  11891.     GOTO 7905
  11892. 8901    CONTINUE
  11893.     DROW=LR
  11894.     DCOL=LC
  11895.     THISRW=LR
  11896.     THISCL=LC
  11897. 3801    ICODE=1
  11898.     GOTO 9990
  11899. 8010    CONTINUE
  11900.     IF(CMDLIN(1).NE.'>')GOTO 3802
  11901. C >STRING SEARCHES FORMULAE FOR STRING
  11902.     LA=MIN0(IDOL5,RRWACT)
  11903.     LB=MIN0(IDOL6,RCLACT)
  11904. C NO ACTION UNLESS VALID SEARCH REGION (CURRENT TO RELOC BDY)
  11905. C EXISTS.
  11906.     IF(LA.LT.PROW.OR.LB.LT.PCOL)GOTO 3801
  11907.     DO 3803 ID1=PROW,LA
  11908.     DO 3803 ID2=PCOL,LB
  11909.     ID1A=ID1
  11910.     ID2A=ID2
  11911.     CALL FVLDGT(ID1,ID2,FVLD(1,1))
  11912.     IF(JCHAR(FVLD(1,1)).EQ.0)GOTO 3803
  11913. C HAVE VALID CELL HERE, SO GRAB ITS FORMULA AND COMPARE FOR THE ONE
  11914. C WE'RE LOOKING FOR. IF CMD LINE STARTS WITH >> ANCHOR THE SEARCH AT 1ST
  11915. C COL.
  11916.     LMX=50
  11917.     LMN=2
  11918.     IF(CMDLIN(2).NE.'>')GOTO 3805
  11919.     LMX=1
  11920.     LMN=3
  11921. 3805    CONTINUE
  11922. C    IRX=(ID2-1)*60+ID1
  11923.     CALL REFLEC(ID2,ID1,IRX)
  11924.     CALL WRKFIL(IRX,FORM,0)
  11925.     CALL CE2A(FORM,FORM2)
  11926.     DO 3804 IV=1,LMX
  11927.     KKKK=109-IV
  11928. C COMPARE FORMULA TEXT. USE EXISTING SCMP ROUTINE.
  11929.     CALL SCMP(CMDLIN(LMN),FORM2(IV),KKKK,KKK)
  11930.     IF(KKK.EQ.1.AND.JCHAR(FORM2(IV)).GT.0)GOTO 3800
  11931.     IF(JCHAR(FORM2(IV)).LE.0)GOTO 3803
  11932. 3804    CONTINUE
  11933. 3803    CONTINUE
  11934. C IF WE FALL THROUGH, WE FAILED TO FIND FORMULA SO FORGET IT.
  11935.     GOTO 3801
  11936. 3802    CONTINUE
  11937.     IF(CMDLIN(1).NE.'Z')GOTO 8011
  11938. C ZERO COMMAND
  11939. C ZA OR ZE V1:V2
  11940.     IF(CMDLIN(2).NE.'A')GOTO 8950
  11941. C ZA = ZERO ALL. BE SURE HE MEANS IT.
  11942.     CALL UVT100(1,LLDSP,1)
  11943. c    WRITE(0,8951)
  11944. c8951    FORMAT('Really Zero All of sheet [Y/N]?\')
  11945.     call Vwrt('Really Zero ALL of sheet [Y/N]?',31)
  11946.     III=IOLVL
  11947. C    IF(III.EQ.5)III=0
  11948.     if(iii.ne.11)READ(III,8952,END=510,ERR=510)(FORM2(KKI),KKI=1,4)
  11949.     if(iii.eq.11)call vget(form2,4)
  11950. 8952    FORMAT(4A1)
  11951.     ICODE=6
  11952.     IF(FORM2(1).NE.'Y'.AND.FORM2(1).NE.'y')GOTO 9990
  11953.     CALL UVT100(11,2,0)
  11954.     ICODE=-4
  11955.     GOTO 9990
  11956. 8950    IF(CMDLIN(2).NE.'E')GOTO 9990
  11957.     ASSIGN 8953 TO IBACK
  11958.     GOTO 8104
  11959. C GET NAMES
  11960. 8953    IF(L1.LE.0)GOTO 9990
  11961.     ASSIGN 8954 TO JBACK
  11962.     GOTO 8109
  11963. 8954    CONTINUE
  11964.     DO 8955 NI=1,128
  11965. 8955    FORM2(NI)=0
  11966.     FORM2(118)=Char(15)
  11967.     DO 8823 NI=1,9
  11968. 8823    FORM2(119+NI)=DEFVB(1+NI)
  11969.     DO 8956 NI=1,IDELT
  11970. C    IRX=(ID2-1)*60+ID1
  11971.     CALL REFLEC(ID2,ID1,IRX)
  11972.     CALL WRKFIL(IRX,FORM2,1)
  11973.     CALL FVLDST(ID1,ID2,CHAR(0))
  11974.     CALL XVBLST(ID1,ID2,0.0D0)
  11975.     IPRS=PROW
  11976.     IPCS=PCOL
  11977.     PROW=ID1
  11978.     PCOL=ID2
  11979.     ASSIGN 8957 TO NBK
  11980. C FIND DISPLAY LOC IF ANY
  11981.     GOTO 7905
  11982. 8957    PROW=IPRS
  11983.     PCOL=IPCS
  11984.     IF(LR.EQ.0.OR.LC.EQ.0)GOTO 8958
  11985.     DVS(LR,LC)=DVS(LR,LC)+1.E-11
  11986. 8958    CONTINUE
  11987.     ID1=ID1+I1IN
  11988.     ID2=ID2+I2IN
  11989. 8956    CONTINUE
  11990.     GOTO 9990
  11991. 8011    IF(CMDLIN(1).NE.'X')GOTO 8012
  11992. C EXIT TO OS
  11993. C SINCE THERE'S NO WORKFILE HERE, MAKE SURE HE MEANS IT...
  11994.     IF(IPSET.NE.0)GOTO 9990
  11995.     ICODE=2
  11996.     CALL UVT100(1,LLDSP,1)
  11997.         call 
  11998.      1 swrt('Exit now may lose data unless sheet has been saved'
  11999.      2 ,50)
  12000.     CALL UVT100(1,LLCMD,1)
  12001.     call Vwrt('Confirm Exit Request [Y/N]:',27)
  12002.     III=IOLVL
  12003. C    IF(IOLVL.EQ.5)III=0
  12004.     if(iii.ne.11)READ(III,8952,END=510,ERR=510)(FORM2(KKI),KKI=1,4)
  12005.     if(iii.eq.11)call vget(form2,4)
  12006.     IF(FORM2(1).NE.'Y'.AND.FORM2(1).NE.'y')GOTO 9990
  12007. C END CALL TO GET OUT OF HERE
  12008. c    Close(unit=11)
  12009.     Close(unit=3)
  12010.     Call TTYDEI
  12011.         STOP
  12012. C    CALL EXIT
  12013. 8012    IF(CMDLIN(1).NE.'S')GOTO 8013
  12014. C SAVE SHEET TO DISK (NEW SET OF DATA)
  12015. C NOW JUST PERMITS RESTART...
  12016.     ICODE=-2
  12017.     ISTAT=-2
  12018.     CALL UVT100(11,2,0)
  12019.     GOTO 9990
  12020. 8013    IF(CMDLIN(1).NE.'P')GOTO 8014
  12021.     IRTN=0
  12022.     CALL PGET(CMDLIN,ICODE,IRTN)
  12023.     IF(IRTN.EQ.1)GOTO 510
  12024.     GOTO 9990
  12025. 8014    CONTINUE
  12026. 8015    IF(CMDLIN(1).NE.'G')GOTO 8016
  12027. C GET INPUT NUMBERS OFF SEQUENTIAL FILE. USE CURRENT ORIGIN
  12028.     ICODE=2
  12029.     IRTN=0
  12030.     CALL PGGET(CMDLIN,ICODE,IRTN)
  12031.     IF(IRTN.EQ.1)GOTO 510
  12032. C FLAG WE NEED AT LEAST ONE FULL CALC BEFORE GOING TO PARTIALS...
  12033. C (OK TOO IF IN OLD RCMODE=0 MODE)
  12034.     RCMODE=-IABS(RCMODE)
  12035.     GOTO 9990
  12036. 8016    IF(CMDLIN(1).NE.'W')GOTO 8017
  12037. C WRITE (PRINT) SCREEN OUT TO FILE (MAY BE PRINTER)
  12038. C    CALL DSPSHT(10)
  12039. C    ICODE=1
  12040.     ICODE=400
  12041. C CODE 10 IS PRINT SECRET CODE TO DSPSHT.
  12042.     GOTO 9990
  12043. 8017    CONTINUE
  12044.     IF(CMDLIN(1).NE.'H')GOTO 5019
  12045.     IF(IPSET.NE.0)GOTO 9990
  12046.     IVVV=0
  12047.     IVVVV=ICHAR(CMDLIN(2))
  12048.     ivvx=ICHAR(cmdlin(3))
  12049. 9308    CONTINUE
  12050.     IF(IVVVV.GE.48.AND.IVVVV.LE.57)IVVV=IVVVV-48
  12051.     if(ivvx.lt.48.or.ivvx.gt.57)goto 9381
  12052. c implement 2 digit help code.
  12053.     ivvvx=ivvx-48
  12054.     ivvv=(ivvv*10)+ivvvx
  12055.     ivvv=min0(ivvv,99)
  12056. 9381    continue
  12057. C SELECT HELP LEVEL 0-9 IF SPECIFIED.
  12058.     ICODE=30+IVVV
  12059.     GOTO 9990
  12060. 5019    CONTINUE
  12061. C *** ALLOW EVALUATION OF A CELL TO PERMIT INTERACTIVE COMMAND FILES TO
  12062. C *** BE CONTROLLED RATIONALLY. KEYWORD IS "TEST"
  12063.     IF(CMDLIN(1).NE.'T'.OR.CMDLIN(2).NE.'E')GOTO 4302
  12064. C TEST EXPRESSION IS SYNTAX.
  12065. C COPY CMDLIN INTO XTNCMD AND FLAG VIA ICODE=430
  12066.     XTNCNT=0
  12067.     ICODE=430
  12068.     DO 4307 N=1,80
  12069. 4307    XTNCMD(N)=Char(0)
  12070. C FIRST ZERO OUT EXTERNAL CMD LINE, THEN FILL IN WHAT'S NEEDED.
  12071.     DO 4303 N=1,79
  12072.     XTNCMD(N)=CMDLIN(3+N)
  12073. C ALLOW "TE <ANY EXPRESSION>" WITH OPTIONAL SPACE. JUST RETURNS VALUE IN
  12074. C % VARIABLE.
  12075.     IF(ICHAR(XTNCMD(N)).LT.32)GOTO 4304
  12076.     XTNCNT=N
  12077. 4303    CONTINUE
  12078. 4304    CONTINUE
  12079.     XTNCMD(XTNCNT+1)=Char(0)
  12080.     GOTO 9990
  12081. 4302    CONTINUE
  12082. C LET DOUBLE DOT (..) INDICATE TO GO BACK TO CONSOLE, CLOSING INPUT FILE
  12083.     IF (CMDLIN(1).EQ.'.'.AND.CMDLIN(2).EQ.'.')GOTO 510
  12084. C ELSE PRINT MESSAGE THAT WE DON'T UNDERSTAND THAT ONE & GO ON
  12085. C PRINT INVALID CMD MSG IF NOT JUST A SPACE OR C.R.
  12086.     IF(ICHAR(CMDLIN(1)).GT.32)CALL SWRT('Invalid Command.',16)
  12087.     GOTO 200
  12088. C ERROR ON READIN ADDRESS. REWIND TERMINAL IF USER
  12089. C TYPES CTRL Z (EOF), ELSE LEAVE INDIRECT FILES.
  12090. 510    CONTINUE
  12091. C    IF(IOLVL.EQ.5)REWIND 5
  12092.     CLOSE(3)
  12093. c    CLOSE(11)
  12094. c    Rewind 11
  12095. c    OPEN(11,FILE='CON:0/0/100/100/Analy Command')
  12096.     IOLVL=11
  12097.     GOTO 498
  12098. 9990    CONTINUE
  12099. C HERE CLEAN UP AND RETURN
  12100. C FIRST DISPLAY LAST CURRENT COL IN NORMAL VIDEO
  12101.     IF(IXLSTR.LE.0.OR.IXLSTC.LE.0)GOTO 2000
  12102.     N1=NRDSP(IXLSTR,IXLSTC)
  12103.     N2=NCDSP(IXLSTR,IXLSTC)
  12104. C    IRRX=(N2-1)*60+N1
  12105.     CALL REFLEC(N2,N1,IRRX)
  12106. C REWRITE LAST LOCATION WITH NO REVERSE VIDEO.
  12107. C    IF(FVLD(N1,N2).EQ.0)GOTO 2000
  12108.     IF(IXLSTC.GT.DCLV.OR.IXLSTR.GT.DRWV)GOTO 2000
  12109. C ONLY REDRAW NUMBERS. DIRECT DISPLAY OR NOTHING GETS IGNORED.
  12110.     IF(ICODE.LT.0.OR.ICODE.EQ.2)GOTO 2000
  12111. C NO SENSE REDRAWING IF WE'RE ABOUT TO ERASE DISPLAY ANYWAY.
  12112.     IF(ICODE.GT.30)GOTO 2000
  12113.     J=8
  12114. C ADD 6 COLS FOR LABELS
  12115. C DROW,DCOL IS CURRENT DISPLAY LOC.
  12116.     DO 3301 M1=1,IXLSTR
  12117. C FIND DISPLAY COLUMN TO USE
  12118. 3301    J=J+CWIDS(M1)
  12119.     J=J-CWIDS(IXLSTR)
  12120. C USE THISCL+1 TO LET 1ST ROW BE LABELS.
  12121.     ICCC=IXLSTC+2
  12122. C JVTINC = 1 IF VT100, 0 IF VT52
  12123. C JVTINC NEEDED SINCE UVT100 FOR VT100 DOES BACKSPACE AT THE SGR ENTRY
  12124. C AND THUS WE NEED TO CORRECT FOR IT. THIS WAS FIXED IN THE UVT52
  12125. C VERSION AND ITS DESCENDANTS.
  12126.     IC1POS=N1
  12127.     IC2POS=N2
  12128.     IF(PZAP.NE.0)GOTO 2000
  12129.     CALL UVT100(1,ICCC,J)
  12130. C SELECT ROW "IXLSTC", COL "J"
  12131.     CALL UVT100(13,0,0)
  12132. C DESELECT REVERSE VIDEO
  12133.     CALL FVLDGT(N1,N2,FVLDTP)
  12134.     ivv=min0(30,cwids(IXLSTR))
  12135.     IF(ICHAR(FVLDTP).EQ.0)CALL SWRT(BLANKS,IVV)
  12136.     IF(ICHAR(FVLDTP).EQ.0)GOTO 2000
  12137.     CALL WRKFIL(IRRX,FORM2,0)
  12138.     CALL CE2A(FORM2,FORM)
  12139. C    READ(7'IRRX)FORM
  12140.     DO 5546 KKKK=1,100
  12141.     IV=ICHAR(FORM(KKKK))
  12142.     IV=MAX0(IV,32)
  12143. 5546    FORM(KKKK)=Char(IV)
  12144.     IF(JCHAR(FVLDTP).LT.0.OR.FORMFG.NE.0)
  12145.      1  WRITE(CMDLNA(1:127),8201)(FORM(II),II=1,100)
  12146. C FILL IN TEXT FOR FORMULA IF FVLD < 0 HERE; BELOW, FILL IN VALUE TEXT IF FVLD
  12147. C > 0.
  12148.     IF(FORMFG.NE.0)GOTO 4324
  12149. C ALWAYS DO FORMULAS IF FORMFG SET (VF MODE).
  12150.     DO 6302 KKK=1,9
  12151.     KKKK=ICHAR(FORM(KKK+119))
  12152. C    KKKK=DFMTS(KKK,IXLSTR,IXLSTC)
  12153. 6302    DFE(KKK+1)=CHAR(MAX0(32,KKKK))
  12154.     DFE(11)=char(32)
  12155. C 32 = ASCII SPACE
  12156.     DFE(1)='('
  12157. C REMEMBER: NO \ EDITING IN INTERNAL WRITES!
  12158.     DFE(12)=' '
  12159.     DFE(13)=' '
  12160.     DFE(14)=')'
  12161.     CALL TYPGET(N1,N2,TYPE(1,1))
  12162.     IF(JCHAR(FVLDTP).LE.0)GOTO 4324
  12163.     IF(TYPE(1,1).NE.2)GOTO 6226
  12164.         WRITE(CMDLNA(1:127),DFE,ERR=4324)DVS(IXLSTR,IXLSTC)
  12165.     GOTO 4324
  12166. 6226    CONTINUE
  12167.     WRITE(CMDLNA(1:127),DFE,ERR=4324)LDVS(1,IXLSTR,IXLSTC)
  12168. C REDRAW THIS COL. WITHOUT REVERSE VIDEO HERE.
  12169. 4324    CALL SWRT(CMDLIN,CWIDS(IXLSTR))
  12170. C NOTE THIS REDRAWS PREVIOUS COL. IN NORMAL VIDEO.
  12171. C NO CARRIAGE CTL
  12172. 2000    CONTINUE
  12173. C NOW COMPLETE ANY CLEANUP.
  12174. C SET CMDLIN TO 0 AT START TO INHIBIT ANY MISINTERPRETATION.
  12175. C WE USE CMDLIN AS A BUFFER IN REDRAWIND DSPLY SO DON'T LET IT GET
  12176. C CLOBBERED.
  12177.     DO 945 K=1,132
  12178. 945    CMDLIN(K)=Char(0)
  12179.     RETURN
  12180.     END
  12181.  
  12182. C *************** AnalyNS.Ftn #####################################
  12183. c -h- nextel.fms    Tue Sep  2 10:58:55 1986    
  12184.     SUBROUTINE NEXTEL (RETVAL,RETTYP,RETCD)
  12185. C COPYRIGHT (C) 1983,1984 GLENN AND MARY EVERHART
  12186. C ALL RIGHTS RESERVED
  12187. C
  12188. C  SCANS LINE(80) FROM NONBLK+1 AND RETURNS THE NEXT ELEMENT.
  12189. C  THIS ELEMENT COULD BE A CONSTANT, VALUE OF A VARIABLE, A
  12190. C  BINARY FUNCTION CODE, OR A UNARY FUNCTION CODE. UPON RETURN,
  12191. C  NONBLK POINTS TO LAST CHARACTER OF NEXT ELEMENT.
  12192. C
  12193. C  RETCD  =    1  IF OPERAND (VALUE IN RETVAL(100)
  12194. C        2  IF OPERATOR (VALUE IN RETTYP)
  12195. C        3  NO MORE ELEMENTS
  12196. C        4  IF ERROR
  12197. C
  12198. C  RETVAL  HOLDS VALUE OF OPERAND FOUND (EITHER CONSTANT OR IF
  12199. C       A VARIABLE (A-Z,%), THE VALUE OF THAT VARIABLE)
  12200. C
  12201. C  RETTYP  IS THE TYPE CODE
  12202. C NEXTEL CALLS
  12203. C
  12204. C ERRMSG     PRINTS OUT ERROR MESSAGES
  12205. C FLIP       REVERSES THE NON-LEADING ZERO DIGITS IN A VECTOR
  12206. C GETNNB     GETS THE NEXT NON-BLANK FROM LINE(80)
  12207. C
  12208. C NEXTEL IS CALLED BY INPOST
  12209. C
  12210. C
  12211. C    VARIABLE    USE
  12212. C    ---------   ----------------------------------
  12213. C
  12214. C    ALPHA(27)   HOLDS LEGAL VARIABLE NAMES.
  12215. C
  12216. C    ARROW       '^'
  12217. C
  12218. C    B10         SWITCH SET WHEN CONSTANT IS NOT OCTAL (MAY BE
  12219. C                DECIMAL OR HEX BECAUSE THE DIGIT 8 OR 9 WAS FOUND).
  12220. C
  12221. C    B16         SWITCH SET WHEN CONSTANT IS HEXADECIMAL BECAUSE
  12222. C                DIGIT A, B, C, D, E, OR F WAS FOUND.
  12223. C
  12224. C    BASE        HOLDS BASE OF CONSTANT.
  12225. C
  12226. C    CHAR1       HOLDS A SINGLE CHARACTER FROM LINE.
  12227. C
  12228. C    DEFBAS      THE DEFAULT BASE SPECIFIED.
  12229. C
  12230. C    DIGITS(16,3) HOLDS ASCII CHARACTERS FOR THE DIGITS OF BASES
  12231. C                 8, 10, AND 16.
  12232. C
  12233. C    DOT          '.'
  12234. C
  12235. C    EQ           '='
  12236. C
  12237. C    EXCODE       CODE FOR EXPONENTIATION.
  12238. C
  12239. C    FCNT         NUMBER OF UNARY FUNCTIONS DEFINED BY VECTOR FUNCT
  12240. C
  12241. C    FUNCT (NAME,INDXX) HOLDS FUNCTION NAMES.
  12242. C
  12243. C    FUNVAL(I,J)
  12244. C     IF I=1, THE VALUE IS THE NUMBER OF CHARACTERS IN THE J-TH
  12245. C             FUNCTION WHOSE NAME IS THE FUNCT(K,J) WHERE K=1,2,3...10
  12246. C     IF I=2, THE VALUE IS THE STACK ELEMENT CODE FOR THE J-TH
  12247. C             FUNCTION WHOSE NAME IS IN FUNCT(K,J), K=1,2,3...10
  12248. C
  12249. C
  12250. C    I,J,K,L  HOLDS TEMPORARY VALUES
  12251. C
  12252. C    I1,I2    HOLD VALUE OF DIGITS IN E OR D SPECIFICATION.
  12253. C
  12254. C    IALPHA   INDEX INTO ALPHA OF THE FIRST NON-BLANK CHARACTER FOUND.
  12255. C
  12256. C    IHOLD    HOLDS TEMPORARY VALUES
  12257. C
  12258. C    INT      PICKS UP INTEGER*4 VALUES.
  12259. C
  12260. C    IPT      POINTER TO ELEMENTS IN LINE(80).
  12261. C
  12262. C    IPT2     POINTER TO ELEMENTS IN LINE(80).
  12263. C
  12264. C    LASTOP  USED TO HOLD VALUE OF LAST OPERATOR SO THAT UNARY OPERATORS
  12265. C            CAN BE IDENTIFIED IN CASES LIKE A*-B AND A/(-3).
  12266. C
  12267. C    MINUS   '-'
  12268. C
  12269. C    OPER(9) HOLDS LEGAL ONE CHARACTER OPERATORS LIKE '+' AND '*'.
  12270. C
  12271. C    PLUS    '+'
  12272. C
  12273. C    QUOTE   "'"
  12274. C
  12275. C    RB      HOLDS NEGATIVE POWERS OF 10.(BASE 10)
  12276. C
  12277. C    REAL    PICKS UP REAL*8 CONSTANTS.
  12278. C
  12279. C    RETCD   RETURN CODE:
  12280. C              1 IF OPERAND (VALUE IN RETVAL(100))
  12281. C              2 IF OPERATOR (VALUE IN RETTYP)
  12282. C              3 NO MORE ELEMENTS.
  12283. C              4 IF ERROR.
  12284. C
  12285. C    RETCD2  RETURN CODE WHEN CALLING GETNNB.
  12286. C
  12287. C    RETPT   INDEXES DIGITS PICKED UP FOR A CONSTANT.
  12288. C
  12289. C    RETTYP  THE TYPE CODE OF THE RETURNED ELEMENT.
  12290. C
  12291. C    TYPE    TYPE CODE FOR EACH VARIABLE.
  12292. C
  12293. C    VBLS    HOLDS VALUE OF VARIABLES.
  12294. C
  12295. C    VLEN    GIVES LENGTH IN BYTES FOR EACH DATA TYPE.
  12296. C
  12297. C LASTOP MUST BE SET TO ZERO AT START OF EXPRESSION
  12298. C
  12299. C
  12300.     REAL*8 REAL,RB,ACX,XAC
  12301.     INTEGER*4 INT
  12302.     EXTERNAL INDX,DFLOAT
  12303.     REAL*8 DFLOAT
  12304.     InTeGer*4 INDXX
  12305.     InTeGer*4 LEVEL,NONBLK,LEND
  12306.     InTeGer*4 LASTOP
  12307.     InTeGer*4 VIEWSW,BASED,VLEN(9),DEFBAS
  12308.     InTeGer*4 TYPE(1,1)
  12309.     InTeGer*4 RETCD,RETCD2,RETTYP,EXCODE
  12310.     InTeGer*4 B10,B16,RETPT,BASE
  12311.     InTeGer*4 FCNT,AHOLD
  12312.     InTeGer*4 I,J,K,L,IALPHA,IHOLD,IPT,IPT2,I1,I2
  12313. C
  12314.     CHARACTER*1 CHAR1,DOT,ARROW,QUOTE,STAR,MINUS,PLUS
  12315.     CHARACTER*1 RETVAL(20)
  12316. C    REAL*8 RVLF
  12317. C    EQUIVALENCE (FVLF,RETVAL(1))
  12318.     CHARACTER*1 FUNCT(10,40)
  12319.     InTeGer*4   FUNVAL(2,40)
  12320.     CHARACTER*1 AVBLS(20,27)
  12321.     EQUIVALENCE(XAC,AVBLS(1,27))
  12322.     CHARACTER*1 VBLS(8,1,1)
  12323.     CHARACTER*1 OPER(9),DIGITS(16,3)
  12324.     CHARACTER*1 LINE(80),ALPHA(27),COMMA,BLANK,RPAR,LPAR,EQ
  12325.     CHARACTER*1 FOUR(4),EIGHT(8)
  12326. C
  12327.     COMMON /V/ TYPE,AVBLS,VBLS,VLEN
  12328.     COMMON /DIGV/ DIGITS
  12329.     COMMON  LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  12330.     COMMON /CONS/ ALPHA,COMMA,BLANK,RPAR,LPAR,EQ
  12331. C ***<<< KLSTO COMMON START >>>***
  12332.     InTeGer*4 DLFG
  12333. C    COMMON/DLFG/DLFG
  12334.     InTeGer*4 KDRW,KDCL
  12335. C    COMMON/DOT/KDRW,KDCL
  12336.     InTeGer*4 DTRENA
  12337. C    COMMON/DTRCMN/DTRENA
  12338.     REAL*8 EP,PV,FV
  12339.     DIMENSION EP(20)
  12340.     INTEGER*4 KIRR
  12341. C    COMMON/ERNPER/EP,PV,FV,KIRR
  12342. c    InTeGer*4 LASTOP
  12343. C    COMMON/ERROR/LASTOP
  12344.     CHARACTER*1 FMTDAT(9,76)
  12345. C    COMMON/FMTBFR/FMTDAT
  12346.     CHARACTER*1 EDNAM(16)
  12347. C    COMMON/EDNAM/EDNAM
  12348.     InTeGer*4 MFID(2),MFMOD(2)
  12349. C    COMMON/FRM/MFID,MFMOD
  12350.     InTeGer*4 JMVFG,JMVOLD
  12351. C    COMMON/FUBAR/JMVFG,JMVOLD
  12352.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  12353.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  12354. C ***<<< KLSTO COMMON END >>>***
  12355. CCC    COMMON /ERROR/ LASTOP
  12356. C
  12357.     EQUIVALENCE (REAL,EIGHT),(FOUR,INT)
  12358. C
  12359.     DATA DOT/'.'/,ARROW/'^'/,QUOTE/''''/,STAR/'*'/
  12360.     DATA MINUS/'-'/,PLUS/'+'/
  12361.     DATA OPER/'(','-','!','*','/','+','-',')','='/
  12362. C
  12363. C  NUMBER OF FUNCTIONS
  12364.     DATA FCNT/30/
  12365. C
  12366.     DATA FUNCT/'A','B','S',' ',' ',' ',' ',' ',' ', ' ',
  12367.      1             'D','A','B','S',' ',' ',' ',' ',' ',' ',
  12368.      2             'I','A','B','S',' ',' ',' ',' ',' ',' ',
  12369.      3             'F','L','O','A','T',5*' ','I','F','I','X',6*' ',
  12370.      5             'A','I','N','T',6*' ','I','N','T',7*' ',
  12371.      7             'I','D','I','N','T',5*' ','E','X','P',7*' ',
  12372.      9             'D','E','X','P',6*' ','A','L','O','G','1','0',4*' ',
  12373.      2             'D','L','O','G','1','0',4*' ','A','L','O','G',6*' ',
  12374.      4             'D','L','O','G',6*' ','S','Q','R','T',6*' ',
  12375.      6             'D','S','Q','R','T',5*' ','S','I','N',7*' ',
  12376.      8             'D','S','I','N',6*' ','C','O','S',7*' ',
  12377.      1             'D','C','O','S',6*' ','T','A','N','H',6*' ',
  12378.      2             'D','T','A','N','H',5*' ','A','T','A','N',6*' ',
  12379.      3             'D','A','T','A','N',5*' ',
  12380.      1             'A','S','I','N',6*' ','D','A','S','I','N',5*' ',
  12381.      2             'A','C','O','S',6*' ','D','A','C','O','S',5*' ',
  12382.      3             'T','A','N',' ',6*' ','D','T','A','N',106*' '/
  12383.     DATA EXCODE/112/
  12384.        DATA FUNVAL/3,31,4,31,4,32,5,33,4,34,4,35,3,36,5,36,3,37,4,37,
  12385.      1 6,39,6,39,4,38,4,38,4,40,5,40,3,41,4,41,3,42,4,42,4,43,5,43,
  12386.      2       4,44,5,44,4,45,5,45,4,46,5,46,3,47,4,47,20*0/
  12387. C
  12388. 10    CONTINUE
  12389.     CALL GETNNB(IPT,RETCD2)
  12390.     IF (RETCD2.EQ.1) GOTO 50
  12391. C
  12392. C  NO MORE ELEMENTS
  12393.     LASTOP=0
  12394.     RETCD=3
  12395.     RETURN
  12396. C
  12397. C
  12398. C  INITIALIZE VARIABLES
  12399. 50    CONTINUE
  12400.     B10=0
  12401.     B16=0
  12402.     RETTYP=0
  12403.     RETPT=0
  12404.     REAL=0.D0
  12405.     RETCD=1
  12406.     DEFBAS=BASED
  12407. C    RVLF=0.0D0
  12408. C COMMENT OUT DO LOOP OVER 20 BYTES FOR SPEED.
  12409. C (INSTEAD JUST ZERO 8 BYTES WE WILL LIKELY USE)
  12410.     DO 60 I=1,8
  12411. C    DO 60 I=1,20
  12412. 60    RETVAL(I)=0
  12413. C
  12414. 70    CHAR1=LINE(IPT)
  12415.     NONBLK=IPT
  12416. C
  12417. C
  12418. C  SEE IF ALPHABETIC OR %
  12419. C SHORTCUT IF IT'S A CELL NAME .. GO JUST EVALUATE IT.
  12420. C ALSO WORKS FOR ENCODED FUNCT NAMES.
  12421.     IF(ICHAR(CHAR1).GE.255)GOTO 12000
  12422. C SEPARATE OUT FUNCTION CALLS FOR FASTER EXECUTION...SKIP TRYING FUNCT. NAME
  12423. C FIRST AS VARIABLE NAME (WHICH CAN TAKE LONG TIME TO CONVERT BEFORE WE DISCOVER
  12424. C IT ISN'T NEEDED...)
  12425. C
  12426.     IF(ICHAR(CHAR1).GE.230)GOTO 13201
  12427. C ADD COUPLE MORE SHORTCUTS... DON'T JUST LOOP TO SEE IF WE HAVE
  12428. C AN ALPHA CHARACTER...
  12429.     IF(CHAR1.NE.ALPHA(27))GOTO 78
  12430.     I=27
  12431.     GOTO 10000
  12432. 78    CONTINUE
  12433.     IF(CHAR1.LT.'A'.OR.CHAR1.GT.'Z')GOTO 79
  12434. C TRY TO AVOID LOTS OF EXTRA FUNCTION CALLS...
  12435. C COMPARE CHARS AS CHARACTER VALUES... SHOULD STILL BE OK.
  12436. CCC    IF(ICHAR(CHAR1).LT.ICHAR(ALPHA(1))
  12437. CCC     1  .OR.ICHAR(CHAR1).GT.ICHAR(ALPHA(26)))GOTO 79
  12438. C USE FACT THAT ASCII CHARACTER CODES ARE IN A CONTINUOUS RANGE
  12439. CCC    I=ICHAR(CHAR1)-ICHAR(ALPHA(1))
  12440.     I=ICHAR(CHAR1)-65
  12441. C 65 IS ASCII VALUE FOR 'A' CHARACTER.
  12442. C (HARDCODE FOR SPEED...)
  12443.     GOTO 10000
  12444. 79    CONTINUE
  12445. C DELETE 3 LINES FOLLOWING:
  12446. C    DO 80 I=1,27
  12447. C    IF (CHAR1.EQ.ALPHA(I)) GOTO 10000
  12448. C80    CONTINUE
  12449. C
  12450. C
  12451. C  NOT ALPHA SO SEE IF AN OPERATOR
  12452.     DO 100 I=1,9
  12453.     IF (CHAR1.EQ.OPER(I)) GOTO 20000
  12454. 100    CONTINUE
  12455. C
  12456. C
  12457. C SEE IF AN OPERAND
  12458. C *** EVIDENTLY SHORT LOOP RUNS AS FAST AS A COUPLE DECISIONS AND SOME
  12459. C MATH; LEAVE IN.
  12460. 140    DO 150 I=1,16
  12461.     IF (CHAR1.EQ.DIGITS(I,3)) GOTO 30000
  12462. 150    CONTINUE
  12463. C
  12464. C
  12465. C
  12466.     IF (CHAR1.EQ.DOT) GOTO 40000
  12467. C
  12468. C
  12469. C
  12470.     IF (CHAR1.EQ.ARROW) GOTO 300
  12471. C
  12472. C
  12473. C
  12474.     IF (CHAR1.EQ.QUOTE) GOTO 200
  12475. C
  12476. C
  12477. C  ADDITIONAL CONSTANT OPERATOR WOULD GO HERE
  12478. C
  12479. C
  12480. C *** ERROR *** ILLEGAL CHARACTER ENCOUNTERED
  12481. 190    CALL ERRMSG (20)
  12482.     GOTO 99000
  12483. C
  12484. C
  12485. C
  12486. C
  12487. C **************************************
  12488. C ****** ASCII CONSTANT SPECIFIED ******
  12489. C **************************************
  12490. 200    CONTINUE
  12491.     NONBLK=NONBLK+1
  12492.     RETVAL(1)=ICHAR(LINE(NONBLK))
  12493.     RETTYP=1
  12494.     GOTO 35100
  12495. C
  12496. C
  12497. C
  12498. C
  12499. C **************************************
  12500. C ****** IMMEDIATE BASE SPECIFIED ******
  12501. C **************************************
  12502. 300    CALL GETNNB(IPT,RETCD2)
  12503.     IF (RETCD2.EQ.1) GOTO 320
  12504. C
  12505. C
  12506. C *** ERROR *** ILLEGAL BASE SPECIFICATION
  12507. 310    CALL ERRMSG(19)
  12508.     GOTO 99000
  12509. C
  12510. C
  12511. C  IMMEDIATE BASE SPECIFICATION
  12512. 320    CHAR1=LINE(IPT)
  12513.     NONBLK=IPT
  12514.     IF (CHAR1.EQ.DIGITS(8,3)) GOTO 360
  12515.     IF (CHAR1.NE.DIGITS(1,3)) GOTO 310
  12516. C
  12517. C
  12518. C FIRST DIGIT IS 1 SO IMMEDIATE BASE MIGHT BE 10 OR 16
  12519.     CALL GETNNB (IPT,RETCD2)
  12520.     IF (RETCD2.EQ.2) GOTO 310
  12521.     CHAR1=LINE(IPT)
  12522.     NONBLK=IPT
  12523.     IF (CHAR1.EQ.DIGITS(10,1)) GOTO 365
  12524.     IF (CHAR1.NE.DIGITS(6,1)) GOTO 310
  12525. C
  12526. C
  12527. C IMMEDIATE BASE IS 16
  12528.     DEFBAS=16
  12529.     GOTO 370
  12530. C
  12531. C
  12532. C IMMEDIATE BASE IS 8
  12533. 360    DEFBAS=8
  12534.     GOTO 370
  12535. C
  12536. C
  12537. C IMMEDIATE BASE IS 10
  12538. 365    DEFBAS=10
  12539. C
  12540. C
  12541. C
  12542. 370    CALL GETNNB(IPT,RETCD2)
  12543.     IF (RETCD2.EQ.2) GOTO 310
  12544.     CHAR1=LINE(IPT)
  12545.     NONBLK=IPT
  12546. C
  12547. C
  12548. C GO FIND OUT WHAT NUMBER HAS THAT DEFAULT BASE
  12549.     GOTO 140
  12550. C
  12551. C
  12552. C
  12553. C
  12554. C ****************************************************
  12555. C ****** SEARCH TO SEE IF A UNARY FUNCTION NAME ******
  12556. C ****************************************************
  12557. 10000    CONTINUE
  12558.     IALPHA=I
  12559.     IHOLD=NONBLK
  12560. C
  12561. C
  12562. C SCAN EACH OF THE FUNCTION NAMES.
  12563.     DO 10060 I=1,FCNT
  12564. C
  12565. C K HOLDS NUMBER OF NON-BLANK CHARACTERS IN THE FUNCTION NAME.
  12566.     K=FUNVAL(1,I)
  12567.     IPT2=IHOLD
  12568.     NONBLK=IHOLD
  12569.     IF (K.EQ.0) GOTO 10060
  12570. C
  12571. C
  12572. C SCAN EACH LETTER OF THE FUNCTION'S NAME
  12573.     DO 10050 J=1,K
  12574.     IF (LINE(IPT2).NE.FUNCT(J,I)) GOTO 10060
  12575.     IF (J.EQ.K) GOTO 10100
  12576.     CALL GETNNB (IPT2,RETCD2)
  12577.     IF (RETCD2.EQ.2) GOTO 10060
  12578.     NONBLK=IPT2
  12579. 10050    CONTINUE
  12580.     STOP 10050
  12581. C
  12582. 10060    CONTINUE
  12583. 10070    NONBLK=IHOLD
  12584.     GOTO 12000
  12585. C
  12586. C
  12587. C  FUNCTION FOUND (LEAVES NONBLK POINTING AT LAST CHARACTER)
  12588. 10100    CONTINUE
  12589. C
  12590. C
  12591. C
  12592. C
  12593. C **********************************
  12594. C ****** UNARY FUNCTION FOUND ******
  12595. C **********************************
  12596.     RETTYP=ICHAR(CHAR(FUNVAL(2,I)))
  12597.     LASTOP=RETTYP
  12598.     RETCD=2
  12599.     GOTO 99099
  12600. C
  12601. C
  12602. C
  12603. C
  12604. C
  12605. C ********************************
  12606. C ****** VARIABLE SPECIFIED ******
  12607. C ********************************
  12608. 12000    CONTINUE
  12609. C
  12610. C
  12611. C  IALPHA HOLDS INDEX INTO ALPHA OF NAME
  12612. C ******&&&&&& REMOVE BLK OF CODE STARTING HERE...
  12613. C    CALL GETNNB (IPT,RETCD2)
  12614. C    IF (RETCD2.EQ.2) GOTO 12060
  12615. CC
  12616. CC
  12617. CC MAKE SURE NEXT CHARACTER IS NOT ALPHA
  12618. C    DO 12050 I=1,27
  12619. C    IF (LINE(IPT).EQ.ALPHA(I)) GOTO 12200
  12620. C12050    CONTINUE
  12621. C *****&&&&& ...ENDING HERE
  12622. C ADD BELOW...
  12623.     LLB=IPT
  12624.     LRB=LEND
  12625.     CALL VARSCN(LINE,LLB,LRB,LSTCHR,ID1,ID2,IVALID)
  12626. C    IF(IVALID.EQ.0)GOTO 12200
  12627. C    IPT=LSTCHR
  12628. C leave the following "60" in place. It's only roughly right
  12629. C (probably should be more like 30) but will do since funct.
  12630. C names are 3 chars...
  12631.     IF(IVALID.NE.0.AND.ID2.LE.1.AND.ID1.GT.60)GOTO 13201
  12632.     IF(IVALID.NE.0)GOTO 12201
  12633. C NOT VALID VARIABLE. SEE IF A 2 + ARGUMENT FUNCTION...
  12634. C
  12635. C COME HERE DIRECT FOR FUNCTIONS ENCODED...
  12636. 13201    CONTINUE
  12637.     I=IPT+9
  12638.     CALL FNAME(LINE(IPT),I,INDEXF)
  12639.     IF(INDEXF.EQ.6.OR.INDEXF.LT.1.OR.INDEXF.GT.26)GOTO 12202
  12640. C NOW KNOW THERE IS A FUNCTION THERE, SO HANDLE IT.
  12641.     LLAST=LEND-IPT+1
  12642.     I=INDX(LINE(IPT),ICHAR(']'))
  12643.     IF(I.LE.0.OR.I.GT.LLAST)GOTO 12202
  12644.     LRB=I
  12645.     LLB=INDX(LINE(IPT),ICHAR('['))
  12646.     IF(LLB.LE.0.OR.LLB.GT.LLAST)GOTO 12202
  12647.     CALL DOMFCN(LINE(IPT),LLB,LRB,INDEXF,ACX)
  12648.     XAC=ACX
  12649.     TYPE(1,1)=2
  12650.     CALL TYPSET(1,27,TYPE(1,1))
  12651. C    TYPE(27,1)=2
  12652.     ID1=27
  12653.     ID2=1
  12654.     LSTCHR=LRB+IPT
  12655. C GO AND MERGE AS THOUGH WE JUST GOT A VARIABLE % AND HAD TO
  12656. C RETURN ITS VALUE.
  12657.     GOTO 12201
  12658. C IF NOT VALID FUNCTION REPORT AN ERROR.
  12659. 12202    GOTO 12200
  12660. 12201    IPT=LSTCHR
  12661.     IF(LSTCHR.LT.LEND)IPT=IPT-1
  12662.     NONBLK=IPT
  12663. C RESET NONBLK ALST SO WE RESET GETNNB TOO...
  12664. C WAS IPT=LSTCHR+1
  12665. C IPT POINTS AFTER VARIABLE NAME...
  12666. C ENSURE NON ALPHA AFTER VARIABLE NAME
  12667.     CALL GETNNB(IPT,RETCD2)
  12668.     IF(RETCD2.EQ.2) GOTO 12060
  12669. C
  12670. C IF THE NEXT CHARACTER IS AN = SIGN DON'T RETURN VALUE
  12671. C OF VARIABLE, JUST PUT INDEX INTO VBLS INTO LOWER BYTE
  12672. C OF RETVAL.
  12673.     IF (LINE(IPT).EQ.EQ) GOTO 12100
  12674. C
  12675. C
  12676. C ************************************************
  12677. C ****** RETURN VALUE OF VARIABLE SPECIFIED ******
  12678. C ************************************************
  12679. 12060    CALL TYPGET(ID1,ID2,RETTYP)
  12680. C12060    RETTYP=TYPE(ID1,ID2)
  12681. C *****&&&&&
  12682. C MUST CLAMP TYPES SO EXTENDED VARIABLES CAN'T BE MULT PRCN VRBLS.
  12683.     IF(ID1.LE.27.AND.ID2.EQ.1) GOTO 12061
  12684.     IF (RETTYP.EQ.5)RETTYP=4
  12685.     IF (RETTYP.EQ.6)RETTYP=8
  12686.     IF (RETTYP.EQ.7)RETTYP=3
  12687. 12061    CONTINUE
  12688.     IF(RETTYP.LE.0)GO TO 12080
  12689.     K=VLEN(RETTYP)
  12690.     DO 12070 I=1,K
  12691.     IF(ID1.LE.27.AND.ID2.EQ.1) GOTO 12068
  12692. C TRY AND CALL XVBLGT HERE TO GET VALUE ALL AT ONCE
  12693. C TO AVOID MULTIPLE ARBITRATION...
  12694.     IF(I.EQ.K)CALL XVBLGT(ID1,ID2,RETVAL)
  12695. C    CALL VBLGET(I,ID1,ID2,RETVAL(I))
  12696. C    RETVAL(I)=VBLS(I,ID1,ID2)
  12697.     GOTO 12070
  12698. 12068    RETVAL(I)=AVBLS(I,ID1)
  12699. 12070    CONTINUE
  12700. C
  12701. 12080    LASTOP=RETTYP
  12702.     GOTO 99099
  12703. C
  12704. C
  12705. C
  12706. C *******************************************************
  12707. C ****** VARIABLE SPECIFIED BUT FOLLOWED BY = SIGN ******
  12708. C *******************************************************
  12709. 12100    CONTINUE
  12710. C    RETVAL(1)=IALPHA
  12711. C    RETTYP=TYPE(IALPHA)
  12712.     CALL TYPGET(ID1,ID2,TYPE(1,1))
  12713.     CALL RVBOO(RETVAL,ID1,ID2)
  12714. C RVBOO JUST STUFFS ID1,ID2 INTO RETVAL ARRAY
  12715. C AS 2 INTEGERS.
  12716.     RETTYP=TYPE(1,1)
  12717.     GOTO 12080
  12718. C
  12719. C
  12720. C
  12721. C *** ERROR *** UNIDENTIFIED FUNCTION
  12722. 12200    CALL ERRMSG(18)
  12723.     GOTO 99000
  12724. C
  12725. C
  12726. C
  12727. C
  12728. C
  12729. C **********************
  12730. C ****** OPERATOR ******
  12731. C **********************
  12732. C
  12733. C  I IS INDEX INTO OPER TO TELL WHAT OPERATOR IT IS
  12734. 20000    CONTINUE
  12735.     RETCD=2
  12736.     IF(I.NE.4)GO TO 20050
  12737. C
  12738. C
  12739. C IF AN ASTERISK IS FOUND THE NEXT CHARACTER MUST BE EXAMINED
  12740. C TO SEE IF '**' WAS SPECIFIED FOR EXPONENTIATION.
  12741.     CALL GETNNB (IPT,RETCD2)
  12742.     IF(RETCD2.NE.1)GO TO 99000
  12743.     IF (LINE(IPT).NE.STAR) GOTO 20050
  12744. C
  12745. C
  12746. C '**' SPECIFIED (EXPONENTIATION)
  12747.     RETTYP=EXCODE
  12748.     NONBLK=IPT
  12749.     GO TO 12080
  12750. C
  12751. C
  12752. C
  12753. C  SET DEFAULT RETTYP FOR OPERATORS
  12754. 20050    RETTYP=109+I
  12755. C
  12756. C
  12757. C  CHECK OUT POSSIBLE UNARY OPERATOR "-"
  12758.     IF (RETTYP.NE.111) GOTO 20080
  12759. C
  12760. C
  12761. C IF A MINUS IS ENCOUNTERED AND THERE WAS NO PREVIOUS ELEMENT OR
  12762. C IF PREVIOUS ELEMENT WAS AN OPERATOR OR = SIGN THEN OPERATOR
  12763. C IS UNARY.
  12764.     IF (LASTOP.EQ.0.OR.(LASTOP.GE.110.AND.LASTOP.LE.116).OR.
  12765.      ;      LASTOP.EQ.200) GOTO 20090
  12766. C
  12767. C
  12768. C  BINARY SUBTRACTION OPERATOR
  12769.     RETTYP=116
  12770.     GOTO 12080
  12771. C
  12772. C
  12773. C
  12774. C SEE IF A '+' SIGN
  12775. 20080    IF(RETTYP.NE.115)GO TO 20085
  12776. C
  12777. C
  12778. C DETERMINE IF IT IS A UNARY PLUS
  12779.     IF(LASTOP.NE.0.AND.LASTOP.LE.100)GO TO 20085
  12780. C
  12781. C
  12782. C SEE IF LAST OPERATOR WAS ')'
  12783.     IF(LASTOP.EQ.117)GO TO 20085
  12784. C
  12785. C
  12786. C UNARY '+' FOUND.
  12787.     RETCD=1
  12788.     GO TO 10
  12789. C
  12790. C
  12791. C
  12792. C RESET LASTOP TO 0 IF LEFT PARENTHESIS IS FOUND (CODE 110)
  12793. C IF RETTYP IS FOR =, SET TO PROPER CODE
  12794. 20085    IF(RETTYP.EQ.110)GO TO 20090
  12795.     IF(RETTYP.EQ.118)RETTYP=200
  12796.     GO TO 12080
  12797. C
  12798. C
  12799. C UNARY -
  12800. 20090    CONTINUE
  12801.     GOTO 99097
  12802. C
  12803. C
  12804. C
  12805. C
  12806. C
  12807. C
  12808. C *************************
  12809. C ****** NON-DECIMAL ******
  12810. C *************************
  12811. C
  12812. 30000    RETPT=RETPT+1
  12813.     IF (RETPT.LE.19) GOTO 30020
  12814. C
  12815. C
  12816. C *** ERROR *** MULTIPLE PRECISION IS LIMITED TO 19 DIGITS
  12817. C (ACTUALLY, NO LONGER PRESENT...)
  12818.     CALL ERRMSG(22)
  12819.     GOTO 99000
  12820. C
  12821. C
  12822. C  I HOLDS INDEX INTO DIGITS THAT WAS A MATCH.
  12823. C  SEE IF VALUE OF DIGIT IMPLIES A HIGHER BASE.
  12824. 30020    IF (I.NE.16) GOTO 30030
  12825.     I=0
  12826.     GOTO 30050
  12827. 30030    IF (I.EQ.8.OR.I.EQ.9) B10=1
  12828.     IF(I.GT.9) B16=1
  12829. 30050    RETVAL(RETPT)=CHAR(I)
  12830. C
  12831. C
  12832. C GET NEXT CHARACTER
  12833.     CALL GETNNB (IPT,RETCD2)
  12834.     IF (RETCD2.NE.1) GOTO 30100
  12835.     NONBLK=IPT
  12836.     CHAR1=LINE(IPT)
  12837.     DO 30070 I=1,16
  12838.     IF (CHAR1.EQ.DIGITS(I,3)) GOTO 30000
  12839. 30070    CONTINUE
  12840.     IF (CHAR1.EQ.DOT) GOTO 40000
  12841.     NONBLK=NONBLK-1
  12842. 30100    CONTINUE
  12843. C
  12844.     IF (DEFBAS.EQ.16.OR.B16.EQ.1) GOTO 30200
  12845.     IF (DEFBAS.EQ.10.OR.B10.EQ.1) GOTO 30300
  12846. C
  12847. c add code here to check for non -calc mode and goto 40000 if so
  12848. c if defbas.ne.8 and if we're working on a floating number
  12849. C
  12850. C *****************************
  12851. C ****** BASE 8 CONSTANT ******
  12852. C *****************************
  12853.     BASE=8
  12854. C
  12855. C
  12856. C IF MORE THAN 10 DIGITS IT IS MULTIPLE PRECISION
  12857.     IF (RETPT.GT.10) GOTO 30170
  12858.     RETTYP=8
  12859. C
  12860. C
  12861. C  CONVERT TO OCTAL, HEX OR INTEGER
  12862. 30110    INT=0
  12863. 30130    DO 30132 L=1,7
  12864.     IF (ICHAR(RETVAL(L)).NE.0) GOTO 30140
  12865. 30132    CONTINUE
  12866. 30140    DO 30150 I=L,RETPT
  12867.     INT=INT*BASE+ICHAR(RETVAL(I))
  12868.     RETVAL(I)=0
  12869. 30150    CONTINUE
  12870.     RETVAL(20)=0
  12871. 30155    DO 30160 I=1,4
  12872. 30160    RETVAL(I)=FOUR(I)
  12873.     GOTO 35100
  12874. C
  12875. C
  12876. C ************************************************
  12877. C ****** MULTIPLE PRECISION BASE 8 CONSTANT ******
  12878. C ************************************************
  12879. 30170    RETTYP=6
  12880. 30180    CALL FLIP (RETVAL,8,RETPT)
  12881. c was 20 above, not 8 but we shortened stack arrays so shorten this
  12882.     GOTO 35100
  12883. C
  12884. C
  12885. C
  12886. C *********************
  12887. C ****** BASE 16 ******
  12888. C *********************
  12889. 30200    BASE=16
  12890. C
  12891. C
  12892. C IF MORE THAN 7 DIGITS IT IS MULTIPLE PRECISION.
  12893.     IF (RETPT.GT.7) GOTO 30270
  12894. C
  12895. C
  12896. C
  12897. C  HEXADECIMAL
  12898.     RETTYP=3
  12899.     GOTO 30110
  12900. C
  12901. C
  12902. C
  12903. C
  12904. C ****************************************
  12905. C ****** MULTIPLE PRECISION BASE 16 ******
  12906. C ****************************************
  12907. 30270    RETTYP=7
  12908.     GOTO 30180
  12909. C
  12910. C
  12911. C *********************
  12912. C ****** BASE 10 ******
  12913. C *********************
  12914. 30300    BASE=10
  12915. C
  12916. C
  12917. C IF MORE THAN 9 DIGITS IT IS MULTIPLE PRECISION.
  12918.     IF (RETPT.GT.9) GOTO 30370
  12919. C
  12920. C
  12921. C  INTEGER
  12922.     RETTYP=4
  12923.     GOTO 30110
  12924. C
  12925. C
  12926. C ****************************************
  12927. C ****** MULTIPLE PRECISION BASE 10 ******
  12928. C ****************************************
  12929. 30370    RETTYP=5
  12930.     GOTO 30180
  12931. C
  12932. C
  12933. C
  12934. C
  12935. C
  12936. C SET LASTOP AND EXIT
  12937. 35100    LASTOP=RETTYP
  12938.     GOTO 99099
  12939. C
  12940. C
  12941. C *****************************
  12942. C ****** REAL OR DECIMAL ******
  12943. C *****************************
  12944. 40000    IF (B16.NE.1) GOTO 40020
  12945. C
  12946. C
  12947. C *** ERROR ***  '.' MAY ONLY BE USED WITH BASE 10
  12948.     CALL ERRMSG(21)
  12949.     GOTO 99000
  12950. C
  12951. C
  12952. C
  12953. 40020    IF (RETPT.EQ.0) GOTO 40200
  12954. C
  12955. C
  12956. C IGNORE LEADING ZEROES
  12957.     DO 40022 L=1,19
  12958.     IF (ICHAR(RETVAL(L)).NE.0) GOTO 40030
  12959. 40022    CONTINUE
  12960. C
  12961. C IF ALL ZEROES THE LAST ONE COUNTS!
  12962.     L=19
  12963. C
  12964. C
  12965. C CONVERT TO A REAL*8 NUMBER
  12966. 40030    CONTINUE
  12967.     REAL=0.D0
  12968.     DO 40060 I=L,RETPT
  12969.     REAL=REAL*10.D0+ICHAR(RETVAL(I))
  12970.     RETVAL(I)=0
  12971. 40060    CONTINUE
  12972. C
  12973. C
  12974. C  PICK UP FRACTIONAL PART OF REAL (DECIMAL)
  12975. 40200    CONTINUE
  12976.     RB=1.0D0
  12977.     RETTYP=2
  12978. 40205    CALL GETNNB (IPT,RETCD2)
  12979.     IF (RETCD2.EQ.1) GOTO 40300
  12980. C
  12981. C IF NO MORE, YOU GOT IT ALL SO GO PLACE VALUE IN RETVAL.
  12982.     GOTO 40537
  12983. C
  12984. C
  12985. C
  12986. 40300    NONBLK=IPT
  12987.     CHAR1=LINE(IPT)
  12988.     DO 40320 I=1,10
  12989.     IF (CHAR1.EQ.DIGITS(I,1)) GOTO 40330
  12990. 40320    CONTINUE
  12991.     GOTO 40350
  12992. 40330    IF (I.EQ.10) I=0
  12993.     RB=0.1D0*RB
  12994.     REAL=REAL+DFLOAT(I)*RB
  12995.     GOTO 40205
  12996. C
  12997. C
  12998. C CHECK TO SEE IF E OR D EXPONENT SPECIFICATION IS USED.
  12999. 40350    IF (CHAR1.EQ.DIGITS(13,3).OR.CHAR1.EQ.DIGITS(14,3)) GOTO 40360
  13000.     NONBLK=NONBLK-1
  13001.     GO TO 40537
  13002. C
  13003. C
  13004. C *********************************************
  13005. C ****** E AND D EXPONENT SPECIFICATIONS ******
  13006. C *********************************************
  13007. 40360    CONTINUE
  13008.     CALL GETNNB(IPT,RETCD2)
  13009.     IF (RETCD2.EQ.1) GOTO 40370
  13010. C
  13011. C
  13012. C *** ERROR *** ILLEGAL REAL EXPONENT FIELD SPECIFIED
  13013. 40365    CALL ERRMSG (24)
  13014.     GOTO 99000
  13015. C
  13016. C
  13017. 40370    CHAR1=LINE(IPT)
  13018.     IF (CHAR1.EQ.MINUS) GOTO 40380
  13019.     RB=10.D0
  13020.     IF (CHAR1.NE.PLUS) GOTO 40400
  13021.     GOTO 40390
  13022. 40380    RB=0.1D0
  13023. C
  13024. C
  13025. C
  13026. 40390    NONBLK=IPT
  13027.     CALL GETNNB (IPT,RETCD2)
  13028. 40400    IF (RETCD2.GE.2) GOTO 40365
  13029.     NONBLK=IPT
  13030.     CHAR1=LINE(IPT)
  13031.     DO 40450 I=1,10
  13032.     IF (CHAR1.EQ.DIGITS(I,1)) GOTO 40480
  13033. 40450    CONTINUE
  13034.     GOTO 40365
  13035. 40480    IF (I.EQ.10) I=0
  13036. C
  13037. C
  13038. C I1 HOLDS 1ST DIGIT OF EXPONENT SPECIFICATION
  13039.     I1=I
  13040.     CALL GETNNB (IPT,RETCD2)
  13041.     IF (RETCD2.GE.2) GOTO 40550
  13042.     CHAR1=LINE(IPT)
  13043.     NONBLK=IPT
  13044.     DO 40500 I=1,10
  13045.     IF(CHAR1.EQ.DIGITS(I,1)) GO TO 40520
  13046. 40500    CONTINUE
  13047.     NONBLK=NONBLK-1
  13048.     GOTO 40550
  13049. C
  13050. C
  13051. C I2 HOLDS SECOND DIGIT OF EXPONENT SPECIFICATION.
  13052. 40520    IF (I.EQ.10) I=0
  13053.     I2=I
  13054. C
  13055. C
  13056. 40530    RETTYP=9
  13057.     REAL=REAL*RB**(I1*10+I2)
  13058. C
  13059. C
  13060. C
  13061. C ***************************************************
  13062. C ****** COPY REAL*8 INTO RETURN VECTOR RETVAL ******
  13063. C ***************************************************
  13064. 40537    DO 40540 I=1,8
  13065. 40540    RETVAL(I)=EIGHT(I)
  13066.     GOTO 35100
  13067. C
  13068. C
  13069. C
  13070. 40550    I2=I1
  13071.     I1=0
  13072.     GOTO 40530
  13073. C
  13074. C
  13075. C
  13076. C ********************************
  13077. C ******* ERROR PROCESSING *******
  13078. C ********************************
  13079. 99000    CONTINUE
  13080.     IV=LEND-NONBLK+1
  13081.     CALL VWRT(LINE(NONBLK),IV)
  13082. C    WRITE (0,99010) (LINE(I),I=NONBLK,LEND)
  13083. C99010    FORMAT (1X,80(A1,\))
  13084.     RETCD=4
  13085. 99097    LASTOP=0
  13086. 99099    RETURN
  13087.     END
  13088. c -h- pget.for    Tue Sep  2 10:58:55 1986    
  13089.     SUBROUTINE PGET(CMDLIN,ICODE,IRTN)
  13090.     Include AParms.inc
  13091. C NOTE: THROUGHOUT, ROWS ARE ACTUALLY DOWN, COLUMNS ACROSS ON
  13092. C SCREEN. ROW 0 IN DISPLAY IS THE 27 ACCUMULATORS A-Z AND %, WITH
  13093. C % BEING THE LAST-COMPUTED VALUE FROM THE CALC PROGRAM, WHICH
  13094. C KNOWS HOW TO ACCESS THE DATA BUT IS JUST PASSED COMMAND STRINGS
  13095. C FROM THE DISK BASED FILE HERE.
  13096.     CHARACTER*1 FORM,FVLD,CMDLIN(132)
  13097.     INTEGER*4 VNLT
  13098.         Integer*4 IDRO,IDCL
  13099.     CHARACTER*1 LET1,LET2,FORM2(128),FORM3(110),NMSH(80)
  13100.         Character*127 Form2c
  13101.         Equivalence(Form2(1),Form2c)
  13102.         REAL*8 R8S
  13103.     Integer*4 i4s
  13104.     equivalence(r8s,form3(1))
  13105.     equivalence(i4s,form3(1))
  13106.         INTEGER*4 IBIN
  13107.     COMMON/NMSH/NMSH
  13108.     REAL*8 XVBLS(1,1)
  13109.     INTEGER KPYBAK
  13110. C ***<<<< RDD COMMON START >>>***
  13111.     InTeGer*4 RRWACT,RCLACT
  13112. C    COMMON/RCLACT/RRWACT,RCLACT
  13113.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  13114.      1  IDOL7,IDOL8
  13115. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  13116. C     1  IDOL7,IDOL8
  13117.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  13118. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  13119.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  13120. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  13121. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  13122. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  13123.     InTeGer*4 KLVL
  13124. C    COMMON/KLVL/KLVL
  13125.     InTeGer*4 IOLVL,IGOLD
  13126. C    COMMON/IOLVL/IOLVL
  13127. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  13128. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  13129.     integer*4 idsptp,idol9,k3dfg,kcdelt,krdelt,kpag
  13130.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  13131.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  13132.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,Idsptp,idol9,
  13133.      3  k3dfg,kcdelt,krdelt,kpag
  13134. C ***<<< RDD COMMON END >>>***
  13135. CCC    InTeGer*4 IOLVL
  13136.     INTEGER*4 JVBLS(2,1,1)
  13137. CCC    COMMON/IOLVL/IOLVL
  13138. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  13139. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  13140.     DIMENSION FORM(128),FVLD(1,1)
  13141.     CHARACTER*1 FVWRK,FVWRK2
  13142. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  13143. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  13144. C SO INITIALLY IGNORE.
  13145. C FVLD=2 = CONST NUMERIC ONLY, COMPUTED. =3, CONST, NEEDS CALC.
  13146. C
  13147. C ROUTINE IN2AS COMPUTES ASCII CHARACTER NAMES OF SUBSCRIPTS IN1,IN2
  13148.  
  13149. C SO DISPLAY CAN HAVE THEM. IT MUST BE THE INVERSE OF VARSCN.
  13150.     CHARACTER*1 LETA
  13151. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  13152. CCC    InTeGer*4 LLCMD,LLDSP
  13153. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  13154.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  13155.     COMMON/D2R/NRDSP,NCDSP
  13156.     InTeGer*4 TYPE(1,1),VLEN(9)
  13157.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1)
  13158.     REAL*8 XAC,ZAC
  13159.     EQUIVALENCE(XAC,AVBLS(1,27)),(ZAC,AVBLS(1,26))
  13160.     REAL*8 XXAC,XYAC
  13161.     EQUIVALENCE(XXAC,AVBLS(1,24)),(XYAC,AVBLS(1,25))
  13162. C ***<<< XVXTCD COMMON START >>>***
  13163.     CHARACTER*1 OARRY(100)
  13164.     InTeGer*4 OSWIT,OCNTR
  13165. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  13166. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  13167.     InTeGer*4 IPS1,IPS2,MODFLG
  13168. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  13169.        InTeGer*4 XTCFG,IPSET,XTNCNT
  13170.        CHARACTER*1 XTNCMD(80)
  13171. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  13172. C VARY FLAG ITERATION COUNT
  13173.     INTEGER KALKIT
  13174. C    COMMON/VARYIT/KALKIT
  13175.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  13176.     InTeGer*4 RCMODE,IRCE1,IRCE2
  13177. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  13178. C     1  IRCE2
  13179. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  13180. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  13181. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  13182. C RCFGX ON.
  13183. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  13184. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  13185. C  AND VM INHIBITS. (SETS TO 1).
  13186.     INTEGER*4 FH
  13187. C FILE HANDLE FOR CONSOLE I/O (RAW)
  13188. C    COMMON/CONSFH/FH
  13189.     CHARACTER*1 ARGSTR(52,4)
  13190. C    COMMON/ARGSTR/ARGSTR
  13191.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  13192.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  13193.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  13194.      3  IRCE2,FH,ARGSTR
  13195. C ***<<< XVXTCD COMMON END >>>***
  13196. CCC    CHARACTER*1 ARGSTR(52,4)
  13197. CCC    COMMON/ARGSTR/ARGSTR
  13198. C    EQUIVALENCE(ARGSTR(1,1),VBLS(1,1,1))
  13199. C USE VBLS ENTRIES THAT WOULD CORRESPOND TO THE UNUSED SPACE
  13200. C IN VBLS ARRAY FOR ACCUMULATORS A-Z TO HOLD UP TO 4 ARGUMENTS
  13201. C FROM A COMMAND < WHICH READS IN SPACE-DELIMITED ARGUMENTS.
  13202. C THIS WILL ALLOW INTERACTIVE ENTRY OF DATA AND AUTO
  13203. C SUBSTITUTION OF ARGUMENTS VIA THE EDit COMMAND.
  13204.     EQUIVALENCE(XVBLS(1,1),VBLS(1,1,1))
  13205.     INTEGER*4 IIRO,IICO,INUMEM
  13206. C NEED SOME BIG VARIABLES FOR SAVING THE MAPPINGS
  13207.     EQUIVALENCE(JVBLS(1,1,1),XVBLS(1,1))
  13208.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  13209. CCC    COMMON/KLVL/KLVL
  13210.     CHARACTER*1 DEFVB(12)
  13211.     COMMON/DEFVBX/DEFVB
  13212. CCC    InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  13213. CCC    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE
  13214. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  13215. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  13216. C  AND VM INHIBITS. (SETS TO 1).
  13217. C
  13218. C DISPLAY ARRAY WILL KEEP A COPY OF VARIABLES DISPLAYED AND FORMATS
  13219. C USED LOCALLY WHICH DISPLAY ROUTINE CAN USE TO SEE WHAT ACTUALLY
  13220. C NEEDS TO BE REFRESHED ON SCREEN. DRWV AND DCLV ARE COLS, ROWS OF
  13221. C DISPLAY ACTUALLY USED FOR SCREEN.
  13222.     InTeGer*4 CWIDS(20)
  13223. C CWIDS IS WIDTHS IN CHARACTERS OF COLUMNS ON DISPLAY. NOTE THAT BECAUSE
  13224. C OF PECULIAR INVERSION WHICH I AM TOO LAZY TO CORRECT IT IS DIMENSIONED
  13225. C AS 20 NOT 75.
  13226.     REAL*8 DVS(20,75)
  13227.     INTEGER*4 LDVS(2,20,75)
  13228.     EQUIVALENCE(LDVS(1,1,1),DVS(1,1))
  13229.     CHARACTER*76 CFORM
  13230.     EQUIVALENCE(CFORM(1:1),FORM(1))
  13231.     COMMON /FVLDC/FVLD
  13232. C    CHARACTER*1 DFMTS(10,20,75)
  13233. C 10 CHARACTERS PER ENTRY.
  13234.     COMMON/DSPCMN/DVS,CWIDS
  13235. C ***<<< NULETC COMMON START >>>***
  13236.     InTeGer*4 ICREF,IRREF
  13237. C    COMMON/MIRROR/ICREF,IRREF
  13238.     InTeGer*4 MODPUB,LIMODE
  13239. C    COMMON/MODPUB/MODPUB,LIMODE
  13240.     InTeGer*4 KLKC,KLKR
  13241.     REAL*8 AACP,AACQ
  13242. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  13243.     InTeGer*4 NCEL,NXINI
  13244. C    COMMON/NCEL/NCEL,NXINI
  13245.     CHARACTER*1 NAMARY(20,MRows)
  13246. C    COMMON/NMNMNM/NAMARY
  13247.     InTeGer*4 NULAST,LFVD
  13248. C    COMMON/NULXXX/NULAST,LFVD
  13249.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  13250.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  13251. C ***<<< NULETC COMMON END >>>***
  13252.     Character*1 Letr
  13253. CCC    InTeGer*4 ICREF,IRREF
  13254. CCC    COMMON/MIRROR/ICREF,IRREF
  13255. C ENCODE ICREF, IRREF AND CWIDS PAST TITLE IN FIRST LINE
  13256. C (THAT WAY, NOTHING BREAKS IN OTHER PGMS THAT USE THIS)
  13257. C
  13258. C PUT NUMBERS OUT TO FILE
  13259. C USES RELATIVE FORMS TO CURRENT POS.
  13260. C PD = PUT OURT DISPLAY SHEET. PP = PUT OUT PHYSICAL SHEET.
  13261. C ONLY WRITES PHYSICALLY PRESENT DATA.
  13262. C P/D RRR,CCC,FORMULA,VALID,FORMAT
  13263. C N IN 3RD CHR (PPN/PDN) SAVES NUMBERS, ELSE FORMULAS.
  13264.     ICODE=1
  13265.     CLOSE(4)
  13266. 7954    CALL UVT100(1,LLCMD,1)
  13267.     CALL UVT100(12,2,0)
  13268. C ASK FOR FILE NAME
  13269.     CALL VWRT('Enter Filename:',15)
  13270.     III=IOLVL
  13271. C    IF(III.EQ.5)III=0
  13272.     if(iii.ne.11)READ(III,7953,END=510,ERR=510)FORM2
  13273.     if(iii.eq.11)call vget(form2,128)
  13274. c7952    FORMAT(' Enter filename>\')
  13275. 7953    FORMAT(128A1)
  13276.     DO 6940 II=1,128
  13277.     ILN=129-II
  13278.     IF(ICHAR(FORM2(ILN)).GT.32)GOTO 6941
  13279.     FORM2(ILN)=0
  13280. 6940    CONTINUE
  13281. 6941    CONTINUE
  13282. C ILN IS LENGTH OFLINE NOW.
  13283.     ILN=MIN0(ILN,127)
  13284.     FORM2(ILN+1)=0
  13285.         IBIN=0
  13286.         IF(CMDLIN(2).EQ.'B'.OR.CMDLIN(2).EQ.'b')IBIN=1
  13287.     IF(IBIN.EQ.0)CALL WASSIG(4,FORM2)
  13288. C block=-1 is Absoft-specific Amiga hack to get record lengths encoded
  13289. C to allow variable length records to make sense.
  13290.         IF(IBIN.EQ.1)OPEN(UNIT=4,FILE=FORM2c,FORM='UNFORMATTED',
  13291.      1  ACCESS='SEQUENTIAL',STATUS='NEW',BLOCK=-1)
  13292. C NOW ENCODE COL WIDTHS AND ICREF/IRREF
  13293. C SO SAVE/RESTORE OF EXTENDED SHEETS DOESN'T GET
  13294. C MESSED UP.
  13295.     If(Ibin.eq.0)
  13296.      1  WRITE(CFORM(1:76),8850,ERR=8851)ICREF,IRREF,(CWIDS(III),
  13297.      1  III=1,20),DRWV,DCLV
  13298. 8850    FORMAT(24I3)
  13299.     DO 8855 III=1,80
  13300.     II=ICHAR(NMSH(III))
  13301.     IF(II.LT.32)II=32
  13302. 8855    NMSH(III)=CHAR(II)
  13303. 8851    CONTINUE
  13304.     IF(IBIN.EQ.0)WRITE(4,6951)NMSH,(FORM(II),II=1,76)
  13305.         IF(IBIN.EQ.1)WRITE(4,err=448)NMSH,ICREF,IRREF,
  13306.      1  (CWIDS(III),III=1,20),DRWV,DCLV
  13307. 6951    FORMAT(80A1,76A1)
  13308. C ADD ABILITY TO SPECIFY MAX DISPL. TO SAVE
  13309.     CALL UVT100(1,LLCMD,1)
  13310.     CALL UVT100(12,2,0)
  13311.         MDXM=12000
  13312.         LDXM=12000
  13313.         IF(IBIN.EQ.1)GOTO 448
  13314.     CALL VWRT('Enter max. displ down to save or 0 for all>',43)
  13315.     III=IOLVL
  13316. C    IF(III.EQ.5)III=0
  13317.     if(iii.ne.11)READ(III,7978,END=510,ERR=510)LDXM
  13318.     if(iii.ne.11)call vgeti(ldxm)
  13319. 6950    FORMAT(80A1)
  13320. 7978    FORMAT(I7)
  13321.     CALL UVT100(1,LLCMD,1)
  13322.     CALL UVT100(12,2,0)
  13323.     CALL VWRT('Enter max. displcmt right to save or 0 for all>',47)
  13324.     III=IOLVL
  13325. C    IF(III.EQ.5)III=0
  13326.     if(iii.ne.11)READ(III,7978,END=510,ERR=510)MDXM
  13327.     if(iii.ne.11)call vgeti(mdxm)
  13328.     IF(MDXM.LE.0)MDXM=12000
  13329.     IF(LDXM.LE.0)LDXM=12000
  13330. 448     CONTINUE
  13331. C 12000 IS "AN ARBITRARILY LARGE NUMBER TO ASSURE THAT ALL VALID
  13332. C RANGES ARE SAVED". IT MUST BE SMALL ENOUGH TO ASSURE WE DON'T OVERFLOW AN
  13333. C INTEGER THOUGH.
  13334.     IF(CMDLIN(2).NE.'P'.and.CMDLIN(2).GT.' '.AND.IBIN.EQ.0)
  13335.      1   GOTO 7950
  13336. C TREAT "P" BY ITSELF AS A SAVE PP TYPE COMMAND (PUT PHYS)
  13337. C Could speed this by saving only what's been filled.
  13338. C RCLACT can be up to 301, RRWACT can be up to MCols
  13339. C since current cell may be outside this area, use scratch vbls
  13340. C to ensure all's well
  13341.     If(K3dfg.lt.0)Goto 8601
  13342. C write out special "flag" record to preserve 3D mapping
  13343. C information IF mapping is not disabled.
  13344.     Letr='F'
  13345.     if(ibin.eq.1)goto 8602
  13346.     WRITE(4,5403)LETR,k3dfg,KCDelt,KRDelt
  13347.     Goto 8603
  13348. 8602    Continue
  13349.     i4s=KRDelt
  13350.     WRITE(4)LETR,K3Dfg,KCDelt,
  13351.      1  (form3(ivv),ivv=1,110)
  13352. 8603    Continue
  13353. C fill in other rubbish as second part of record.
  13354.     Type(1,1)=2
  13355.     Form2(119)=-3
  13356.     If(Ibin.eq.0)
  13357.      1  WRITE(4,7956)FORM2(119),(FORM2(IV),IV=120,128),TYPE(1,1)
  13358.     If(Ibin.eq.1)
  13359.      1  WRITE(4)FORM2(119),(FORM2(IV),IV=120,128),TYPE(1,1)
  13360. C
  13361. 8601    Continue
  13362.     Irrw=max0(PCOL,RCLACT)
  13363.     Ircl=max0(PROW,RRWACT)
  13364. c    DO 7951 ICO=PCOL,301
  13365. c    DO 7951 IRO=PROW,60
  13366.     DO 7951 ICO=PCOL,Irrw
  13367.     DO 7951 IRO=PROW,Ircl
  13368. C GO DOWN AND RIGHT ONLY. ALLOW MIXING THIS WAY.
  13369. C    IRX=(ICO-1)*60+IRO
  13370.     CALL REFLEC(ICO,IRO,IRX)
  13371.     IDRO=IRO-PROW+1
  13372.     IDCL=ICO-PCOL+1
  13373.     IF(IDRO.GT.LDXM.OR.IDCL.GT.MDXM)GOTO 7951
  13374. C FORM DISPLACEMENT LOCATORS
  13375.     CALL FVLDGT(IRO,ICO,FVLD(1,1))
  13376.     IF(ICHAR(FVLD(1,1)).EQ.0)GOTO 7951
  13377.     CALL WRKFIL(IRX,FORM,0)
  13378.     CALL CE2A(FORM,FORM2)
  13379.     IF(ICHAR(FORM2(119)).EQ.2)FORM2(119)=Char(3)
  13380.     IF(ICHAR(FORM2(119)).EQ.-2)FORM2(119)=Char(253)
  13381.     CALL TYPGET(IRO,ICO,TYPE(1,1))
  13382.     IF(CMDLIN(3).NE.'N')GOTO 5402
  13383.     IF(JCHAR(FVLD(1,1)).LT.0)GOTO 5402
  13384. C ALWAYS WRITE TEXT OUT EVEN IF SAVING NUMERICALLY
  13385. C EMIT NUMBERS, NOT FORMATS **** CHECK 4 OR 2, ASSUME 4=INTEGER
  13386. C INTERNAL PROC TO PRINT NUMERIC VALUES AT 6400
  13387.     LETR='P'
  13388.     ASSIGN 5405 TO INUMEM
  13389. C    GOTO 6400
  13390. 6400    CONTINUE
  13391. C ASSUME LETR IS SET TO GOOD PREFIX LETTER ASCII VALUE
  13392.     CALL XVBLGT(IRO,ICO,XVBLS(1,1))
  13393.         IF(IBIN.EQ.1)GOTO 449
  13394.     IF(IABS(TYPE(1,1)).EQ.4)WRITE(4,5403)LETR,IDRO,IDCL,
  13395.      1  JVBLS(1,1,1)
  13396. 5403    FORMAT(1A1,I5,',',I5,',',I15)
  13397.     IF(IABS(TYPE(1,1)).NE.4)WRITE(4,5404)LETR,IDRO,IDCL,
  13398.      1  XVBLS(1,1)
  13399.         GOTO 450
  13400. 449     CONTINUE
  13401.         R8S=XVBLS(1,1)
  13402.     WRITE(4,err=450)LETR,IDRO,IDCL,FORM3
  13403. 450     CONTINUE
  13404. 5404    FORMAT(1A1,I5,',',I5,',',D30.19)
  13405.     GOTO INUMEM,(5405,6406)
  13406. 5402    CONTINUE
  13407. C FIND END OF TEXT IN ARRAY
  13408.     IVVV=110
  13409.         If(Ibin.eq.1)goto 4331
  13410. C skip this truncation for binary saves
  13411.     DO 4330 IV=2,110
  13412.     IVVV=113-IV
  13413.     IF(ICHAR(FORM2(IVVV)).GT.32)GOTO 4331
  13414. 4330    CONTINUE
  13415. 4331    CONTINUE
  13416. C SAVE ON PPX IN EFFICIENT FORM.
  13417. C DON'T WRITE OUT TRAILING NULLS.
  13418. C ENSURE FORMAT HAS NO NULLS IN IT.
  13419.     DO 358 IV=120,128
  13420. 358    IF(ICHAR(FORM2(IV)).LT.32)FORM2(IV)=Char(32)
  13421.     IF(CMDLIN(3).EQ.'F')GOTO 6404
  13422. C PPF WILL SAVE FORMULAS ONLY
  13423. C PPA WILL SAVE FORMULAS AND VALUES (AS WILL PPc WHERE c IS
  13424. C ANY CHARACTER EXCEPT N.
  13425.     LETR='p'
  13426. C FLAG NUMERIC SAVE VIA LOWERCASE P HERE
  13427.     ASSIGN 6406 TO INUMEM
  13428. C GO WRITE FIRST LINE NUMERICALLY
  13429.     GOTO 6400
  13430. 6406    CONTINUE
  13431. C NOW HAVE NUMERIC LINE WRITTEN. WRITE THE SECOND LINE OF THE
  13432. C GROUP TO, SO AS NOT TO CONFUSE GRAPHICS PROGRAMS AND THE
  13433. C LIKE.
  13434.     III=JCHAR(FORM2(119))
  13435.     IF(IBIN.EQ.0)WRITE(4,7956)III,(FORM2(IV),IV=120,128),
  13436.      1   TYPE(1,1)
  13437.     IF(IBIN.EQ.1)WRITE(4,err=6404)III,(FORM2(IV),IV=120,128),
  13438.      1   TYPE(1,1)
  13439. 6404    CONTINUE
  13440. C NOW WRITE OUT FORMULA RECORD.
  13441.     If(Ibin.eq.0)WRITE(4,7955)IDRO,IDCL,
  13442.      1   (FORM2(IV),IV=1,IVVV)
  13443.         Letr=char(80)
  13444.         If(Ibin.eq.1)Write(4,err=5405)Letr,idro,idcl,
  13445.      1   (form2(iv),iv=1,ivvv)
  13446. 5405    CONTINUE
  13447. C DUMP TO SERIAL FILE IN OUR OWN FORMAT, BUT ALL IN ASCII.
  13448. 7955    FORMAT('P',I5,',',I5,',',128A1)
  13449. C NOTE LONG RECORDS.
  13450.     III=JCHAR(FORM2(119))
  13451.     If(ibin.eq.0)WRITE(4,7956)III,(FORM2(IV),IV=120,128),
  13452.      1  TYPE(1,1)
  13453.     If(Ibin.eq.1)WRITE(4,err=7951)III,(FORM2(IV),IV=120,128),
  13454.      1  TYPE(1,1)
  13455. 7956    FORMAT(I3,',',9A1,',',I5)
  13456. 7951    CONTINUE
  13457. 2751    CONTINUE
  13458. C
  13459. C NOW SAVE NRDSP AND NCDSP MAPPINGS TOO
  13460. C ONLY SAVE MAPPINGS IF 4TH COMMAND CHARACTER IS "M".
  13461. C ... THEY TAKE A LOT OF ROOM.
  13462.     IF (CMDLIN(4).NE.'M') GOTO 6541
  13463.     DO 6540 IRO=DROW,20
  13464.     DO 6540 ICO=DCOL,75
  13465.     IIRO=64000
  13466.     IICO=IIRO
  13467.     IIRO=IIRO+IRO
  13468.     IICO=IICO+ICO
  13469. C NOTE WE MAKE THESE NUMBERS LARGE SO GRAPHING PROGRAMS WON'T TRY
  13470. C TO READ THEM.
  13471. 6955    FORMAT('M',I5,',',I5,',',2I7)
  13472.         Letr='M'
  13473.         If(Ibin.eq.0)
  13474.      1   WRITE(4,6955,ERR=6541)IIRO,IICO,
  13475.      1   NRDSP(IRO,ICO),NCDSP(IRO,ICO)
  13476.         If(Ibin.eq.1)
  13477.      1   WRITE(4,ERR=6541)Letr,IIRO,IICO,
  13478.      1   NRDSP(IRO,ICO),NCDSP(IRO,ICO)
  13479. C WRITE A SPECIAL RECORD, FLAGGED BY 'M', TO SAVE A MAPPING CELL
  13480. C NEED A 2ND RECORD TOO; JUST SEND LAST ONE AGAIN.
  13481.     If(ibin.eq.0)WRITE(4,7956)III,(FORM2(IV),IV=120,128),
  13482.      1  TYPE(1,1)
  13483.     If(Ibin.eq.1)WRITE(4,err=6541)III,(FORM2(IV),IV=120,128),
  13484.      1  TYPE(1,1)
  13485. 6540    CONTINUE
  13486. 6541    CONTINUE
  13487.     CLOSE(4)
  13488.     GOTO 9990
  13489. 7950    IF(CMDLIN(2).NE.'D')GOTO 9990
  13490.     DO 7957 ICO=DCOL,75
  13491.     DO 7957 IRO=DROW,20
  13492.     IDRO=IRO-DROW+1
  13493.     IDCL=ICO-DCOL+1
  13494.     IF(IDRO.GT.LDXM.OR.IDCL.GT.MDXM)GOTO 7957
  13495.     NR=NRDSP(IRO,ICO)
  13496.     NC=NCDSP(IRO,ICO)
  13497. C    IRX=(NC-1)*60+NR
  13498.     CALL REFLEC(NC,NR,IRX)
  13499.     CALL FVLDGT(NR,NC,FVLD(1,1))
  13500.     IF(ICHAR(FVLD(1,1)).EQ.0)GOTO 7957
  13501.     CALL WRKFIL(IRX,FORM,0)
  13502.     CALL CE2A(FORM,FORM2)
  13503.     IF(ICHAR(FORM2(119)).EQ.2)FORM2(119)=Char(3)
  13504.     IF(ICHAR(FORM2(119)).EQ.-2)FORM2(119)=Char(253)
  13505.     IF(CMDLIN(3).NE.'N')GOTO 5412
  13506. C EMIT NUMBERS, NOT FORMATS **** CHECK 4 OR 2, ASSUME 4=INTEGER
  13507.     IF(JCHAR(FVLD(1,1)).LT.0)GOTO 5412
  13508. C WRITE LABELS EVEN IF NUMERIC SAVE
  13509.     CALL TYPGET(NR,NC,TYPE(1,1))
  13510.     CALL XVBLGT(NR,NC,XVBLS(1,1))
  13511.     IF(IABS(TYPE(1,1)).EQ.4)WRITE(4,5413)IDRO,IDCL,JVBLS(1,1,1)
  13512. 5413    FORMAT('P',I5,',',I5,',',I15)
  13513.     IF(IABS(TYPE(1,1)).NE.4)WRITE(4,5414)IDRO,IDCL,XVBLS(1,1)
  13514. 5414    FORMAT('P',I5,',',I5,',',D30.19)
  13515.     GOTO 5415
  13516. 5412    CONTINUE
  13517.     WRITE(4,7958)IDRO,IDCL,(FORM2(IV),IV=1,110)
  13518. 5415    CONTINUE
  13519. 7958    FORMAT('D',I5,',',I5,',',128A1)
  13520.     DO 359 IV=120,128
  13521. 359    IF(FORM2(IV).LT.' ')FORM2(IV)=Char(32)
  13522.     III=JCHAR(FORM2(119))
  13523.     WRITE(4,7956)III,(FORM2(IV),IV=120,128),TYPE(1,1)
  13524. 7957    CONTINUE
  13525. C ALLOW SAVE AS NEEDED OF MAPPING
  13526.     GOTO 2751
  13527. C    CLOSE(4)
  13528. 9990    RETURN
  13529. 510    CONTINUE
  13530.     IRTN=1
  13531.     CLOSE(IOLVL)
  13532. c    CLOSE(11)
  13533. c    OPEN(11,FILE='CON:0/0/100/100/Analy Command')
  13534.     RETURN
  13535.     END
  13536. c -h- pgget.for    Tue Sep  2 10:58:55 1986    
  13537.     SUBROUTINE PGGET(CMDLIN,ICODE,IRTN)
  13538.     Include AParms.inc
  13539. C NOTE: THROUGHOUT, ROWS ARE ACTUALLY DOWN, COLUMNS ACROSS ON
  13540. C SCREEN. ROW 0 IN DISPLAY IS THE 27 ACCUMULATORS A-Z AND %, WITH
  13541. C % BEING THE LAST-COMPUTED VALUE FROM THE CALC PROGRAM, WHICH
  13542. C KNOWS HOW TO ACCESS THE DATA BUT IS JUST PASSED COMMAND STRINGS
  13543. C FROM THE DISK BASED FILE HERE.
  13544.     CHARACTER*1 FORM,FVLD,CMDLIN(132)
  13545.     INTEGER*4 VNLT
  13546.     CHARACTER*1 LET1,LET2,FORM2(128),NMSH(80)
  13547.         Real*8 R8s
  13548.         Integer*4 I4s,I4t
  13549.         Equivalence(R8s,form2(1)),(I4s,form2(1))
  13550.         Equivalence (I4t,form2(3))
  13551.         Character*127 Form2c
  13552.         Equivalence(Form2(1),Form2c)
  13553.     COMMON/NMSH/NMSH
  13554.     REAL*8 XVBLS(1,1)
  13555.     INTEGER KPYBAK
  13556. C ***<<<< RDD COMMON START >>>***
  13557.     InTeGer*4 RRWACT,RCLACT
  13558. C    COMMON/RCLACT/RRWACT,RCLACT
  13559.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  13560.      1  IDOL7,IDOL8
  13561. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  13562. C     1  IDOL7,IDOL8
  13563.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  13564. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  13565.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  13566. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  13567. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  13568. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  13569.     InTeGer*4 KLVL
  13570. C    COMMON/KLVL/KLVL
  13571.     InTeGer*4 IOLVL,IGOLD
  13572. C    COMMON/IOLVL/IOLVL
  13573. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  13574. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  13575.     Integer*4 idsptp,idol9,k3dfg,kcdelt,krdelt,kpag
  13576.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  13577.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  13578.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,Idsptp,Idol9,
  13579.      3  K3dfg,kcdelt,krdelt,kpag
  13580. C ***<<< RDD COMMON END >>>***
  13581. CCC    InTeGer*4 IOLVL
  13582.     INTEGER*4 JVBLS(2,1,1)
  13583.     REAL*8 R8WK
  13584. CCC    COMMON/IOLVL/IOLVL
  13585. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  13586. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  13587.     DIMENSION FORM(128),FVLD(1,1)
  13588.     INTEGER*4 IRRW,ICCL
  13589. C USE BIG NUMBERS SO WE CAN SUBTRACT 64000 AND STILL NOT GET WRAPAROUND.
  13590. C (FOR SAVE/RESTORE OF MAP)
  13591.     CHARACTER*76 CFORM
  13592.     CHARACTER*35 CFORM2
  13593.     EQUIVALENCE(CFORM2(1:1),FORM2(1))
  13594.     EQUIVALENCE(CFORM(1:1),FORM(1))
  13595.     InTeGer*4 NDUM(24)
  13596. C ***<<< NULETC COMMON START >>>***
  13597.     InTeGer*4 ICREF,IRREF
  13598. C    COMMON/MIRROR/ICREF,IRREF
  13599.     InTeGer*4 MODPUB,LIMODE
  13600. C    COMMON/MODPUB/MODPUB,LIMODE
  13601.     InTeGer*4 KLKC,KLKR
  13602.     REAL*8 AACP,AACQ
  13603. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  13604.     InTeGer*4 NCEL,NXINI
  13605. C    COMMON/NCEL/NCEL,NXINI
  13606.     CHARACTER*1 NAMARY(20,MRows)
  13607. C    COMMON/NMNMNM/NAMARY
  13608.     InTeGer*4 NULAST,LFVD
  13609. C    COMMON/NULXXX/NULAST,LFVD
  13610.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  13611.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  13612. C ***<<< NULETC COMMON END >>>***
  13613. CCC    COMMON/MIRROR/ICREF,IRREF
  13614.     CHARACTER*1 FVWRK,FVWRK2
  13615. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  13616. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  13617. C SO INITIALLY IGNORE.
  13618. C FVLD=2 = CONST NUMERIC ONLY, COMPUTED. =3, CONST, NEEDS CALC.
  13619. C
  13620. C ROUTINE IN2AS COMPUTES ASCII CHARACTER NAMES OF SUBSCRIPTS IN1,IN2
  13621. C SO DISPLAY CAN HAVE THEM. IT MUST BE THE INVERSE OF VARSCN.
  13622. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  13623. CCC    InTeGer*4 LLCMD,LLDSP
  13624. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  13625.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  13626.     EXTERNAL INDX
  13627.     COMMON/D2R/NRDSP,NCDSP
  13628.     InTeGer*4 TYPE(1,1),VLEN(9)
  13629.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1)
  13630.     REAL*8 XAC,ZAC
  13631.     EQUIVALENCE(XAC,AVBLS(1,27)),(ZAC,AVBLS(1,26))
  13632.     REAL*8 XXAC,XYAC
  13633.     EQUIVALENCE(XXAC,AVBLS(1,24)),(XYAC,AVBLS(1,25))
  13634. C ***<<< XVXTCD COMMON START >>>***
  13635.     CHARACTER*1 OARRY(100)
  13636.     InTeGer*4 OSWIT,OCNTR
  13637. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  13638. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  13639.     InTeGer*4 IPS1,IPS2,MODFLG
  13640. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  13641.        InTeGer*4 XTCFG,IPSET,XTNCNT
  13642.        CHARACTER*1 XTNCMD(80)
  13643. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  13644. C VARY FLAG ITERATION COUNT
  13645.     INTEGER KALKIT
  13646. C    COMMON/VARYIT/KALKIT
  13647.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  13648.     InTeGer*4 RCMODE,IRCE1,IRCE2
  13649. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  13650. C     1  IRCE2
  13651. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  13652. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  13653. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  13654. C RCFGX ON.
  13655. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  13656. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  13657. C  AND VM INHIBITS. (SETS TO 1).
  13658.     INTEGER*4 FH
  13659. C FILE HANDLE FOR CONSOLE I/O (RAW)
  13660. C    COMMON/CONSFH/FH
  13661.     CHARACTER*1 ARGSTR(52,4)
  13662. C    COMMON/ARGSTR/ARGSTR
  13663.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  13664.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  13665.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  13666.      3  IRCE2,FH,ARGSTR
  13667. C ***<<< XVXTCD COMMON END >>>***
  13668. CCC    CHARACTER*1 ARGSTR(52,4)
  13669. CCC    COMMON/ARGSTR/ARGSTR
  13670. C    EQUIVALENCE(ARGSTR(1,1),VBLS(1,1,1))
  13671. C USE VBLS ENTRIES THAT WOULD CORRESPOND TO THE UNUSED SPACE
  13672. C IN VBLS ARRAY FOR ACCUMULATORS A-Z TO HOLD UP TO 4 ARGUMENTS
  13673. C FROM A COMMAND < WHICH READS IN SPACE-DELIMITED ARGUMENTS.
  13674. C THIS WILL ALLOW INTERACTIVE ENTRY OF DATA AND AUTO
  13675. C SUBSTITUTION OF ARGUMENTS VIA THE EDit COMMAND.
  13676.     EQUIVALENCE(XVBLS(1,1),VBLS(1,1,1))
  13677.     EQUIVALENCE(JVBLS(1,1,1),XVBLS(1,1))
  13678.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  13679. CCC    COMMON/KLVL/KLVL
  13680.     CHARACTER*1 DEFVB(12)
  13681.     COMMON/DEFVBX/DEFVB
  13682. CCC    InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  13683. CCC    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE
  13684. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  13685. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  13686. C  AND VM INHIBITS. (SETS TO 1).
  13687. C
  13688. C DISPLAY ARRAY WILL KEEP A COPY OF VARIABLES DISPLAYED AND FORMATS
  13689. C USED LOCALLY WHICH DISPLAY ROUTINE CAN USE TO SEE WHAT ACTUALLY
  13690. C NEEDS TO BE REFRESHED ON SCREEN. DRWV AND DCLV ARE COLS, ROWS OF
  13691. C DISPLAY ACTUALLY USED FOR SCREEN.
  13692.     InTeGer*4 CWIDS(20)
  13693. C CWIDS IS WIDTHS IN CHARACTERS OF COLUMNS ON DISPLAY. NOTE THAT BECAUSE
  13694. C OF PECULIAR INVERSION WHICH I AM TOO LAZY TO CORRECT IT IS DIMENSIONED
  13695. C AS 20 NOT 75.
  13696.     REAL*8 DVS(20,75)
  13697.     INTEGER*4 LDVS(2,20,75)
  13698.     EQUIVALENCE(LDVS(1,1,1),DVS(1,1))
  13699.     COMMON /FVLDC/FVLD
  13700. CCC    InTeGer*4 NCEL,NXINI
  13701. CCC    COMMON/NCEL/NCEL,NXINI
  13702. C    CHARACTER*1 DFMTS(10,20,75)
  13703. C 10 CHARACTERS PER ENTRY.
  13704.     COMMON/DSPCMN/DVS,CWIDS
  13705. C
  13706. c7952    FORMAT(' Enter filename>\')
  13707. 7953    FORMAT(128A1)
  13708. 6950    FORMAT(80A1)
  13709. 7978    FORMAT(I7)
  13710. 7956    FORMAT(I3,1X,9A1,1X,I5)
  13711.     CLOSE(4)
  13712. 7960    CALL UVT100(1,LLCMD,1)
  13713.     CALL UVT100(12,2,0)
  13714. C GET FILE NAME
  13715.     call Vwrt('Enter Filename:',15)
  13716.     III=IOLVL
  13717. C    IF(III.EQ.5)III=0
  13718.     if(iii.ne.11)READ(III,7953,END=510,ERR=510)FORM2
  13719.     if(iii.eq.11)call vget(form2,128)
  13720.     DO 6940 II=1,128
  13721.     ILN=129-II
  13722.     IF(ICHAR(FORM2(ILN)).GT.32)GOTO 6941
  13723.     FORM2(ILN)=Char(0)
  13724. 6940    CONTINUE
  13725. 6941    CONTINUE
  13726. C ILN IS LENGTH OFLINE NOW.
  13727.     ILN=MIN0(127,ILN)
  13728.     FORM2(ILN+1)=Char(0)
  13729. C SPECIAL "FAST READ" MODE TO SET UP DATA AREAS ON GETTING OLD SHEETS...
  13730.     NXINI=1
  13731.     LDXM=INDX(FORM2,ICHAR('/'))
  13732. C IF FILE IS FILENAME/M WE WON'T DO IT FAST...
  13733.     IF(LDXM.LE.0.OR.LDXM.GE.ILN)GOTO 8400
  13734.     FORM2(LDXM)=Char(0)
  13735. C TERMINATE AFTER THE / AND SET NXINI TO 0 AGAIN
  13736.     NXINI=0
  13737. 8400    CONTINUE
  13738.         Ibin=0
  13739.         If(Cmdlin(2).eq.'B'.OR.cmdlin(2).eq.'b')Ibin=1
  13740.     If(Ibin.eq.0)CALL RASSIG(4,FORM2)
  13741. C BLOCK=-1 IS HACK TO READ ABSOFT UNFORMATTED BIN RECS AS VBL LEN
  13742.         If(Ibin.eq.1)Open(unit=4,file=form2c,form='Unformatted',
  13743.      1  access='SEQUENTIAL',status='OLD',BLOCK=-1)
  13744.         If(Ibin.eq.0)
  13745.      1  READ(4,6951,END=7964,ERR=7964)NMSH,FORM
  13746.         If(Ibin.eq.1)
  13747.      1  READ(4,END=7964,ERR=7107)NMSH,Ndum
  13748. 7107    Continue
  13749. 6951    FORMAT(80A1,76A1,56A1)
  13750. 6952    FORMAT(24I3)
  13751. C TRY TO DECODE ICREF,IRREF, CWIDS, AND DRWV,DCLV
  13752.     If(Ibin.eq.0)READ(CFORM(1:76),6952,ERR=6953)NDUM
  13753. C IF HERE, THE READ WAS OK (APPARENTLY)
  13754. C FILL IN DEFAULTS IF NOTHING BUT ZEROES REALLY WAS SEEN
  13755. C (OR JUST ALL SPACES)
  13756.     ICREF=NDUM(1)
  13757.     IF(ICREF.LE.0.OR.ICREF.GT.MCols)ICREF=10
  13758.     IRREF=NDUM(2)
  13759.     IF(IRREF.LE.0.OR.IRREF.GT.(MRows-1))IRREF=50
  13760. C SET UP CWIDS BUT DEFAULT TO 10 IF NO REAL INFO THERE
  13761.     DO 6954 III=1,20
  13762.     IIVV=NDUM(III+2)
  13763.     IF(IIVV.LT.1.OR.IIVV.GT.100)IIVV=10
  13764.     CWIDS(III)=IIVV
  13765. 6954    CONTINUE
  13766. C RESTORE NUMBER ROWS AND COLS BEING DISPLAYED
  13767. C NOTE WE DO NOT RESTORE THE COMPLETE DISPLAY
  13768. C MAPPING; JUST THE WIDTHS AND NUMBERS OF DISPLAY
  13769. C COLUMNS, AND WE RESTORE THE EXTENDED MAP SO THAT
  13770. C SAVED SHEETS WILL NORMALLY GET BACK THE SAME EXTENDED
  13771. C ADDRESSING THAT HAD BEEN SET UP.
  13772.     DRWV=NDUM(23)
  13773.     IF(DRWV.LT.1.OR.DRWV.GT.20)DRWV=7
  13774.     DCLV=NDUM(24)
  13775.     IF(DCLV.LT.1.OR.DCLV.GT.75)DCLV=20
  13776. 6953    CONTINUE
  13777. C ADD ABILITY TO SPECIFY MAX DISPL. TO SAVE
  13778.     CALL UVT100(1,LLCMD,1)
  13779.     CALL UVT100(12,2,0)
  13780.         mdxm=12000
  13781.         ldxm=12000
  13782.         mmdxm=1
  13783.         lldxm=1
  13784.         If(ibin.eq.1)Goto 662
  13785.     CALL VWRT('Enter max. displc. down to restore or 0 for all>',48)
  13786.     III=IOLVL
  13787. C    IF(III.EQ.5)III=0
  13788.     if(iii.ne.11)READ(III,7978,END=510,ERR=510)MDXM
  13789.     if(iii.eq.11)call vgeti(mdxm)
  13790.     CALL UVT100(1,LLCMD,1)
  13791.     CALL UVT100(12,2,0)
  13792.     CALL VWRT('Enter max. displc. right to restore or 0 for all>',
  13793.      1  49)
  13794.     if(iii.ne.11)READ(III,7978,END=510,ERR=510)LDXM
  13795.     if(iii.eq.11)call vgeti(ldxm)
  13796.     CALL UVT100(1,LLCMD,1)
  13797.     CALL UVT100(12,2,0)
  13798.     CALL VWRT('Enter min. displ. down (1 or more)>',35)
  13799.     if(iii.ne.11)READ(III,7978,END=510,ERR=510)MMDXM
  13800.     if(iii.eq.11)call vgeti(mmdxm)
  13801.     CALL UVT100(1,LLCMD,1)
  13802.     CALL UVT100(12,2,0)
  13803.     CALL VWRT('Enter min displ. right (1 or more)>',35)
  13804.     if(iii.ne.11)READ(III,7978,END=510,ERR=510)LLDXM
  13805.     if(iii.eq.11)call vgeti(lldxm)
  13806. 662     Continue
  13807.     IF(MDXM.LE.0)MDXM=12000
  13808.     LLDXM=MAX0(1,LLDXM)
  13809.     MMDXM=MAX0(1,MMDXM)
  13810.     IF(LDXM.LE.0)LDXM=12000
  13811.     IF(CMDLIN(4).EQ.'+'.OR.CMDLIN(4).EQ.'-')RCFGX=1
  13812. C ENTER RECALC MANUAL MODE IF ADDING NUMBERS OR SUBT.
  13813. C FROM SAVED SHEET
  13814. C 12000 IS, AS ABOVE, JUST A "BIG" NUMBER.
  13815. 7961    CONTINUE
  13816.         If(Ibin.eq.0)
  13817.      1  READ(4,7962,END=7964,ERR=7964)LET1,IRRW,ICCL,(FORM2(IV),
  13818.      1  IV=1,110)
  13819.         If(Ibin.eq.1)
  13820.      1  READ(4,END=7964,ERR=7108)LET1,IRRW,ICCL,(FORM2(IV),
  13821.      1  IV=1,110)
  13822. 7962    FORMAT(A1,I5,1X,I5,1X,128A1)
  13823. 7108    Continue
  13824.         ivv=110
  13825.         If(Ibin.eq.1)Goto 4496
  13826.     DO 4497 IV=1,110
  13827.     IVV=111-IV
  13828.     IF(FORM2(IVV).GT.' ')GOTO 4496
  13829.     FORM2(IVV)=Char(0)
  13830. 4497    CONTINUE
  13831. 4496    CONTINUE
  13832. C ABOVE LOOP ENSURES THAT EXTRA PARTS OF BUFFER NOT IN SAVE FILE ARE
  13833. C ZEROED ON READIN.
  13834.         If(Ibin.eq.0)
  13835.      1  READ(4,7956,END=7964,ERR=7964)III,(FORM2(IV),IV=120,128),
  13836.      1  KKTYP
  13837.         If(Ibin.eq.1)
  13838.      1  READ(4,END=7964,ERR=7109)III,(FORM2(IV),IV=120,128),
  13839.      1  KKTYP
  13840. 7109    Continue
  13841.     FORM2(119)=Char(III)
  13842.     If(k3dfg.lt.0)goto 8602
  13843. C Handle F records (flags)
  13844.     If(Let1.ne.'F')goto 8602
  13845.     if(ibin.ne.0)goto 8603
  13846.     Read(form2c(1:15),8604,err=7961)I4S
  13847. c    DECODE(15,8604,FORM2(1),ERR=7961)I4S
  13848. 8604    FORMAT(I15)
  13849. 8603    Continue
  13850. C set all values together so if decode error occurs things will
  13851. C remain consistent.
  13852.     krdelt=i4s
  13853.     k3dfg=irrw
  13854.     kcdelt=iccl
  13855. C No further processing of flag records.
  13856.     GoTo 7961
  13857. 8602    Continue
  13858.     IF(LET1.EQ.'M')GOTO 6500
  13859. C M CODE MEANS WE'RE READING THE DISPLAY-TO-PHYSICAL MAP.
  13860. C GO HANDLE IT SPECIALLY, THEN RETURN. FLAGS RECORDS BY
  13861. C ADDING 64000 TO ROW AND COL NUMBERS TO AVOID GETTING
  13862. C GRAPHICS PROGRAMS MESSED UP.
  13863. C  NOTE THAT SAVING THE MAP WAS OPTIONAL AND IS NOT THE
  13864. C DO-NOTHING DEFAULT.
  13865.     IF(ICHAR(FORM2(119)).EQ.2)FORM2(119)=Char(3)
  13866.     IF(JCHAR(FORM2(119)).EQ.-2)FORM2(119)=Char(253)
  13867.     IF(IRRW.LE.0.OR.ICCL.LE.0)GOTO 9990
  13868.     IF(IRRW.GT.LDXM.OR.ICCL.GT.MDXM)GOTO 7961
  13869.     IF(IRRW.LT.LLDXM.OR.ICCL.LT.MMDXM) GOTO 7961
  13870. C PRODUCE NEW ADDRESSES IN PHYSICAL SHEET USING SAVED FILE'S ONES
  13871. C AND CURSOR LOCATION (SINCE WE SAVE/RESTORE RELATIVE TO CURSOR).
  13872. C THIS PROVIDES A SHEET PARTIAL SAVE / MERGE CAPABILITY.
  13873.     NR=IRRW+PROW-LLDXM
  13874.     NC=ICCL+PCOL-MMDXM
  13875.     IF(CMDLIN(2).NE.'D'.AND.LET1.NE.68)GOTO 7963
  13876.     IF(CMDLIN(2).EQ.'P'.or.ibin.eq.1)GOTO 7963
  13877. C GET DISPLAY VERSION...
  13878.     LRR=IRRW+DROW-LLDXM
  13879.     LCC=ICCL+DCOL-MMDXM
  13880.     LRR=MAX0(1,LRR)
  13881.     LCC=MAX0(1,LCC)
  13882.     IF(LRR.GT.DRWV.OR.LCC.GT.DCLV)GOTO 7961
  13883.     NR=NRDSP(LRR,LCC)
  13884.     NC=NCDSP(LRR,LCC)
  13885. 7963    CONTINUE
  13886. C LET1='p'WILL COME HERE TOO. HANDLE IT SINCE IT'S NUMERIC STUFF.
  13887. C    IRX=(NC-1)*60+NR
  13888.     CALL REFLEC(NC,NR,IRX)
  13889.     IF(NR.EQ.0.OR.NC.EQ.0)GOTO 7961
  13890.     FORM2(118)=CHAR(15)
  13891.     DO 7113 IVV=1,128
  13892. 7113    FORM(IVV)=FORM2(IVV)
  13893.     INRW=PROW
  13894.     INCL=PCOL
  13895.     JOUTR=1
  13896.     JOUTC=2
  13897. C A1 = OUT LOCATION FOR INPUT CELL NAMES
  13898.     JRTR=1
  13899.     JRTC=1
  13900.     IF(CMDLIN(3).EQ.'R')CALL RELVBL(FORM,FORM2,JOUTR,JOUTC,
  13901.      1  INRW,INCL,JRTR,JRTC)
  13902. C ALLOW RELOCATION ON LOADING SAVED SHEET IF DESIRED.
  13903.     CALL FVLDST(NR,NC,FORM2(119))
  13904. C    FVLD(NR,NC)=FORM2(119)
  13905.     CALL TYPSET(NR,NC,KKTYP)
  13906. C    TYPE(NR,NC)=KKTYP
  13907.     CALL CA2E(FORM2,FORM)
  13908.     IF(LET1.NE.'p')CALL WRKFIL(IRX,FORM,1)
  13909. C    WRITE(7'IRX)FORM2
  13910.     IF(LET1.NE.'p')GOTO 7961
  13911. C HAVE LOWERCASE 'p' NOW AS NUMERIC SAVE FLAG FOR THIS RECORD.
  13912.         if(Ibin.eq.1)xvbls(1,1)=r8s
  13913.         If(Ibin.eq.0)
  13914.      1  READ(CFORM2(1:35),6408,ERR=7961)XVBLS(1,1)
  13915. 6408    FORMAT(BN,D30.19)
  13916.         If(Cmdlin(4).ne.'-'.And.Cmdlin(4).ne.'+')Goto 982
  13917.     CALL XVBLGT(NR,NC,R8WK)
  13918.     IF(CMDLIN(4).EQ.'+')XVBLS(1,1)=XVBLS(1,1)+R8WK
  13919.     IF(CMDLIN(4).EQ.'-')XVBLS(1,1)=R8WK-XVBLS(1,1)
  13920. C IMPLEMENT ADDING AND SUBTRACTING SAVED SHEETS FROM CURRENT.
  13921. C GOES TO RECALC MANUAL MODE SINCE RECALC WOULD MESS UP
  13922. C VALUES; FORMULAS GET UPDATED FROM LAST-READ SHEET NORMALLY.
  13923.     CALL XVBLST(NR,NC,XVBLS(1,1))
  13924. 982     Continue
  13925.     GOTO 7961
  13926. 6500    CONTINUE
  13927. C HERE READ MAPPINGS
  13928.     IRRW=IRRW-64000
  13929.     ICCL=ICCL-64000
  13930. C RESTORE OFFSETS TO NORMAL RANGE
  13931.         If(Ibin.eq.0)
  13932.      1  READ(CFORM2(1:35),6501,ERR=7961)II,III
  13933.         If(Ibin.eq.1)ii=i4s
  13934.         If(Ibin.eq.1)iii=i4t
  13935. 6501    FORMAT(2I7)
  13936.     NRDSP(IRRW,ICCL)=II
  13937.     NCDSP(IRRW,ICCL)=III
  13938. C GO BACK FOR MORE. INEFFICIENT STORAGE OF MAP BUT IT'S COMPACT
  13939. C CODE...
  13940.     GOTO 7961
  13941. 7964    CONTINUE
  13942.     CLOSE(4)
  13943. 9990    NXINI=0
  13944.     RETURN
  13945. 510    CONTINUE
  13946.     IRTN=1
  13947.     NXINI=0
  13948.     CLOSE(IOLVL)
  13949. c    CLOSE(11)
  13950. c    OPEN(5,FILE='CON:0/0/100/100/Analy Command')
  13951.     RETURN
  13952.     END
  13953. c -h- pmtx2.for    Tue Sep  2 10:58:55 1986    
  13954.     SUBROUTINE PMTX2(IRTCD,IMXX,LINE,IBGN,ID1A,ID2A,ID1B,ID2B,
  13955.      1  IDXA,IDXB,IDYA,IDYB,IDBA,IDBB,IDCA,IDCB)
  13956.     CHARACTER*1 LINE(80)
  13957.     CALL GMTX(LINE,IBGN,LSTCHR,ID1A,ID2A,ID1B,
  13958.      1  ID2B,RETCD)
  13959. C GET LOC OF MATRIX A (MUST BE SQUARE)
  13960.     IBGN=LSTCHR+1
  13961.     IF(RETCD.NE.0.OR.IMXX.LE.1)GOTO 1000
  13962.     IF(LINE(LSTCHR).NE.',')GOTO 300
  13963.     CALL GMTX(LINE,IBGN,LSTCHR,IDXA,IDXB,IDYA,
  13964.      1  IDYB,RETCD)
  13965. C GET LOC OF MATRIX X (RESULT).
  13966.     IBGN=LSTCHR+1
  13967.     IF(RETCD.NE.0.OR.IMXX.LE.2)GOTO 1000
  13968.     IF(LINE(LSTCHR).NE.',')GOTO 300
  13969.     CALL GMTX(LINE,IBGN,LSTCHR,IDBA,IDBB,IDCA,
  13970.      1  IDCB,RETCD)
  13971.     IBGN=LSTCHR+1
  13972. C GET LOC OF MATRIX B (AX=B), THE OTHER HALF OF OUR GIVENS
  13973. C IF WE FALL TO HERE, ALL LOOKS OK, SO LEAVE RETCD ALONE.
  13974. C HOWEVER IF ANY ERRS HAVE OCCURRED, RETCD IS ALREADY SET TO 3
  13975. C FOR ERROR...
  13976. 1000    RETURN
  13977. 300    CONTINUE
  13978.     RETCD=3
  13979.     RETURN
  13980.     END
  13981. c -h- postvl.for    Tue Sep  2 10:58:55 1986    
  13982.     SUBROUTINE POSTVL (RETCD)
  13983. C COPYRIGHT (C) 1983 GLENN EVERHART
  13984. C ALL RIGHTS RESERVED
  13985. C 60=MAX REAL ROWS
  13986. C 301=MAX REAL COLS
  13987. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  13988. C VBLS AND TYPE DIMENSIONED 60,301
  13989. C **************************************************
  13990. C *                                                *
  13991.  
  13992. C *      SUBROUTINE  POSTVL (RETCD)                *
  13993. C *                                                *
  13994. C **************************************************
  13995. C
  13996. C
  13997. C  CONVERTS POSTFIX EXPRESSIONS IN STACK 1 TO A VALUE
  13998. C
  13999. C
  14000. C    RETCD    MEANING
  14001. C
  14002. C    1    O.K.
  14003. C    2    ERROR
  14004. C
  14005. C POSTVL CALLS
  14006. C
  14007. C CALBIN    CALCULATES BINARY OPERATIONS
  14008. C CALUN     CALCULATES UNARY OPERATIONS
  14009. C ERRMSG    PRINTS OUT ERROR MESSAGES
  14010. C VAROUT    OUTPUTS THE VALUE OF A VARIABLE
  14011. C
  14012. C
  14013. C
  14014. C
  14015. C POSTVL IS CALLED BY CALC
  14016. C
  14017. C
  14018. C
  14019. C
  14020. C VARIABLE    USE
  14021. C _________ ___________________________
  14022. C
  14023. C    I,K     TEMPORARY VALUES
  14024. C
  14025. C    PT1     POINTS TO TOP ELEMENT IN STACK1
  14026. C
  14027. C    RETCD   RETURN CODE: 1=O.K., 2=ERROR
  14028. C
  14029. C    RETCD2  USED TO HOLD RETURN CODE WHEN CALLS TO
  14030. C            OTHER ROUTINES ARE MADE.
  14031. C
  14032. C    ST1PT   STACK 1 POINTER.
  14033. C
  14034. C    ST2PT   STACK 2 POINTER.
  14035. C
  14036. C    ST1TYP  VECTOR OF TYPES FOR EACH ELEMENT IN STACK 1
  14037. C
  14038. C    ST2TYP  VECTOR OF TYPES FOR EACH ELEMENT IN STACK 2
  14039. C
  14040. C    STACK1  HOLDS ORIGINAL POSTFIX EXPRESSION.
  14041. C
  14042. C    STACK2  USED TO EVALUATE EXPRESSION IN STACK1.
  14043. C
  14044. C    TYPE(27) HOLDS THE DATA TYPE FOR EACH OF THE VARIABLES.
  14045. C
  14046. C    AVBLS(100,27) HOLDS VALUES OF VARIABLES.
  14047. C    VBLS(8,60,301) HOLDS VALUE OF COMPLEXLY-NAMED VARIABLES. 1ST 27 ELEMENTS
  14048. C    ARE PLACE HOLDERS FOR AVBLS; ROUTINES THAT GENERATE DIMENSIONS ID1,ID2
  14049. C    FOR VBLS RETURN DIMENSIONS 1-27,1 FOR A-Z,%. THESE RESULT IN AVBLS
  14050. C    ARRAY BEING USED. VBLS ARRAY (MAX LENGTH 8 BYTES/VARIABLE) IS USED
  14051. C    FOR OTHER VARIABLES WHOSE NAMES ARE <ALPHA><ALPHA><NUM><NUM>
  14052. C    (WITH OPTION FOR ANY REASONABLE # OF ALPHAS AND NUMERICS BUT CLAMPED
  14053. C    AT 60,301 VALUES TO WORK CORRECTLY.)
  14054. C
  14055. C    VIEWSW   VIEW SWITCH:
  14056. C                0 = OFF
  14057. C                1 = DISPLAY COMMANDS
  14058. C                2 = DISPLAY VALUE OF EXPRESSIONS
  14059. C                3 = DISPLAY ALL
  14060. C
  14061. C
  14062. C
  14063. C    SUBROUTINE POSTVL (RETCD)
  14064. C
  14065.     InTeGer*4 LEVEL,NONBLK,LEND
  14066.     InTeGer*4 PT1
  14067.     InTeGer*4 VIEWSW,BASED
  14068.     InTeGer*4 RETCD,RETCD2,VLEN(9)
  14069.     InTeGer*4 TYPE(1,1)
  14070.     InTeGer*4 ST1TYP(40),ST2TYP(40)
  14071.     InTeGer*4 ST1LIM,ST2LIM,ST1PT,ST2PT
  14072.     InTeGer*4 I,K
  14073. C
  14074.     CHARACTER*1 LINE(80)
  14075.     CHARACTER*1 STACK1(8,40), STACK2(8,40),AVBLS(20,27)
  14076.     CHARACTER*1 VBLS(8,1,1)
  14077. C
  14078.     COMMON /STACK/ STACK1,STACK2,ST1PT,ST2PT,ST1TYP,ST2TYP,
  14079.      ;           ST1LIM,ST2LIM
  14080.     COMMON /V/ TYPE,AVBLS,VBLS,VLEN
  14081.     COMMON LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  14082. C
  14083. C
  14084. C
  14085. C
  14086.     RETCD=1
  14087. C
  14088. C
  14089. C IF THERE IS ONE ELEMENT IN STACK1 AND IT IS NOT
  14090. C A NUMBER, THE EXPRESSION IS ILLEGAL (GO TO 95).
  14091.     IF(ST1PT.EQ.2.AND.ST1TYP(1).GT.30)GO TO 95
  14092. C
  14093. C
  14094. 10    IF (ST1PT.GT.2) GOTO 40
  14095.     IF (ST1PT.EQ.1) GOTO 95
  14096. C
  14097. C
  14098. C ***************************************
  14099. C ****** ONLY 1 ELEMENT ON STACK 1 ******
  14100. C ***************************************
  14101.     K=VLEN(ST1TYP(ST1PT-1))
  14102. C
  14103. C
  14104. C COPY INTO VARIABLE %
  14105.     DO 20 I=1,K
  14106. 20    AVBLS(I,27)=STACK1(I,1)
  14107.     CALL TYPSET(27,1,ST1TYP(1))
  14108. C    TYPE(27,1)=ST1TYP(1)
  14109. C
  14110. C
  14111. C OUTPUT VALUE OF %
  14112.     IF (VIEWSW.GT.1) CALL VAROUT(27,1)
  14113.     RETURN
  14114. C
  14115. C
  14116. C  MORE THAN ONE ELEMENT ON STACK1
  14117. 40    CONTINUE
  14118.     IF (ST1TYP(ST1PT-1).LE.30) GOTO 90
  14119.     IF (ST2PT.LE.ST2LIM) GOTO 45
  14120. C
  14121. C
  14122. C *** ERROR *** STACK 2 OVERFLOW
  14123.     CALL ERRMSG(9)
  14124. 43    RETCD=2
  14125.     RETURN
  14126. C
  14127. C
  14128. C
  14129. C
  14130. C ****************************************
  14131. C ****** OPERATOR SO PUT ON STACK 2 ******
  14132. C ****************************************
  14133. 45    ST2TYP(ST2PT)=ST1TYP(ST1PT-1)
  14134.     ST2PT=ST2PT+1
  14135.     ST1PT=ST1PT-1
  14136.     IF(ST1PT.EQ.1)GO TO 95
  14137.     GOTO 40
  14138. C
  14139. C
  14140. C
  14141. C
  14142. C
  14143. C *********************
  14144. C ****** OPERAND ******
  14145. C *********************
  14146. C
  14147. C FIRST BE SURE THAT THERE IS AN OPERATOR INVOLVED ON STACK 2
  14148. C (IF ONLY ONE ELEMENT IN STACK 1 YOU SHOULD NOT BE HERE).
  14149. 90    IF(ST2PT.NE.1)GO TO 110
  14150. C
  14151. C
  14152. C *** ERROR *** ILLLEGAL EXPRESSION
  14153. 95    CALL ERRMSG(8)
  14154.     GO TO 43
  14155. C
  14156. C
  14157. C
  14158. C
  14159. C ENTER HERE AFTER APPLYING AN OPERATOR TO A NUMBER
  14160. 100    IF (ST2PT.EQ.1) GOTO 10
  14161. 110    K=ST2TYP(ST2PT-1)
  14162. C
  14163. C IF A UNARY OPERATOR, GO TO 190
  14164.     IF ((K.GT.30.AND.K.LE.47).OR.K.EQ.111) GOTO 190
  14165. C
  14166. C
  14167. C IF A BINARY OPERATOR, GO TO 170
  14168.     IF (K.GE.110.AND.K.LE.117) GOTO 170
  14169.     IF(K.EQ.200)GO TO 170
  14170. C
  14171. C IF ELEMENT ON STACK2 AT ST2PT-1 IS AN OPERAND, APPLY CALBIN AGAIN
  14172.     IF(K.LE.30) GO TO 180
  14173.     STOP 110
  14174. C
  14175. C
  14176. C
  14177. C
  14178. C ***************************************************************
  14179. C ****** CALBIN CALCULATES THE BINARY VALUE OF AN OPERATOR ******
  14180. C ***************************************************************
  14181. C  UPON ENTRANCE:
  14182. C    OPERAND 1 IS IN STACK 1
  14183. C    OPERAND 2 IS IN STACK 2
  14184. C    OPERATOR IS BELOW OPERAND 2
  14185. C  UPON EXIT RESULT IS ON STACK 1
  14186. C
  14187. C    RETURN CODE    MEANING
  14188. C
  14189. C    1        O.K.
  14190. C    2        OPERATION COMPLETE (RESULT HAS BEEN OUTPUT)
  14191. C    3        ERROR ENCOUNTERED
  14192. C
  14193. C
  14194. 170    CONTINUE
  14195. C
  14196. C
  14197. C FIRST PUT OPERAND 2 ONTO STACK 2
  14198.     PT1=ST1PT-1
  14199.     ST2TYP(ST2PT)=ST1TYP(PT1)
  14200.     K=VLEN(ST2TYP(ST2PT))
  14201.     DO 175 I=1,K
  14202. 175    STACK2(I,ST2PT)=STACK1(I,PT1)
  14203.     ST1PT=ST1PT-1
  14204.     IF(ST1PT.EQ.1)GO TO 95
  14205.     ST2PT=ST2PT+1
  14206. C
  14207. C
  14208. C IF OPERAND 1 IS AN OPERATOR, PUT IT ON STACK 2 (GO TO 45)
  14209.     IF(ST1TYP(ST1PT-1).GT.30) GO TO 45
  14210. 180    CALL CALBIN (RETCD2)
  14211.     GOTO (100,1000,43), RETCD2
  14212.     STOP 180
  14213. C
  14214. C
  14215. C
  14216. C
  14217. C
  14218. C ********************************************************************
  14219. C ****** CALL CALUN TO CALCULATE THE VALUE OF A UNARY OPERATION ******
  14220. C ********************************************************************
  14221. C    OPERATOR IS IN STACK 2
  14222. C    OPERAND IS IN STACK 1
  14223. C    UPON EXIT, OPERATOR IS POPPED OFF STACK 2
  14224. C
  14225. C    RETURN CODE    MEANING
  14226. C
  14227. C    1        O.K.
  14228. C    2        OPERATION COMPLETE (RESULT HAS BEEN OUTPUT)
  14229. C    3        ERROR ENCOUNTERED
  14230. C
  14231. C
  14232. 190    CALL CALUN (RETCD2)
  14233.     GOTO(100,43),RETCD2
  14234.     STOP 190
  14235. C
  14236. C
  14237. 1000    RETURN
  14238.     END
  14239. c -h- prtcon.for    Tue Sep  2 10:58:55 1986    
  14240. C **********************************
  14241. C *                                *
  14242. C *    INTERNAL FUNCTION PRTCON    *
  14243. C *                                *
  14244. C **********************************
  14245. C CALLED BY MOUT ONLY
  14246. C CONVERTS 0 TO APPROPRIATE NUMBER FOR PRINTING WITH VECTOR DIGITS
  14247.     FUNCTION PRTCON(L1,IBASE)
  14248.     InTeGer*4 BASE(3)
  14249.     InTeGer*4 IBASE,K
  14250.     CHARACTER*1 L1,PRTCON,DIGITS(16,3)
  14251.     COMMON /DIGV/ DIGITS
  14252.     DATA BASE /10,8,16/
  14253.     PRTCON=L1
  14254.     IF(L1.EQ.0)PRTCON=CHAR(BASE(IBASE))
  14255.     K=ICHAR(PRTCON)
  14256.     PRTCON=DIGITS(K,IBASE)
  14257.     RETURN
  14258.     END
  14259. c -h- rassig.for    Tue Sep  2 10:58:55 1986    
  14260.     SUBROUTINE RASSIG(IUNIT,NAME)
  14261. C
  14262. C
  14263.     CHARACTER*1 NAME(50)
  14264.     InTeGer*4 IUNIT
  14265. C &&&& MS FTN 3.2
  14266.     LOGICAL LEXIST
  14267. C &&&&
  14268.     CHARACTER*20 WK
  14269.     CHARACTER*1 WK1(20)
  14270.     EQUIVALENCE(WK(1:1),WK1(1))
  14271. C JUST TRY AND NULL FILL A NAME TO USE.
  14272.     DO 1 N=1,20
  14273.     WK1(N)=' '
  14274. 1    CONTINUE
  14275.     DO 2 N=1,20
  14276.     II=ICHAR(NAME(N))
  14277.     IF(II.LT.32)GOTO 3
  14278.     WK1(N)=CHAR(II)
  14279. C1    CONTINUE
  14280. 2    CONTINUE
  14281. 3    CONTINUE
  14282. C CHECK FOR NONEXISTENT FILE FIRST AND CREATE AN EMPTY ONE
  14283. C IF POSSIBLE, THEN CLOSE AND OPEN FOR READ. THIS MAY
  14284. C AVOID CRASHES IF THE FILE ISN'T THERE...
  14285. C MSDOS FORTRAN 3.2 AND LATER FEATURE...
  14286. C &&&&
  14287. C
  14288. C    INQUIRE(FILE=WK,EXIST=LEXIST,ERR=77)
  14289. C
  14290.     INQUIRE(FILE=WK(1:20),EXIST=LEXIST)
  14291.     IF(LEXIST)GOTO 100
  14292. C FILE DOES NOT EXIST, SO CREATE IT HERE.
  14293. C IF CREATE FAILS WE LOSE TOO...
  14294. c    CALL UVT100(1,1,1)
  14295. c    CALL SWRT('File not found. Attempting to create.',37)
  14296. c    OPEN(IUNIT,FILE=WK,STATUS='NEW',ACCESS='SEQUENTIAL',
  14297. c     1  FORM='FORMATTED')
  14298. c    CLOSE(IUNIT)
  14299. c
  14300. c On failure to open a file, create a window instead which
  14301. c can be its surrogate...
  14302. c
  14303.     Open(Iunit,file='CON:200/100/400/60/RdErr ' // wk,
  14304.      1  Access='Sequential',form='Formatted')
  14305. C OPENS AND CLOSES FILE, CREATING A NULL FILE TO READ.
  14306. C WILL GET EOF ON START, BUT THAT'S TOO BAD...
  14307.     Goto 77
  14308. 100    CONTINUE
  14309. C &&&&
  14310. C IF JUST CALL ASSIGN, ASSUME FOR READ.
  14311.     OPEN(IUNIT,FILE=WK,STATUS='OLD',ACCESS='SEQUENTIAL',
  14312.      1  FORM='FORMATTED')
  14313. 77    CONTINUE
  14314. C ON ERRORS IN INQUIRE, ASSUME AN ILLEGAL DEVICE OR SOMETHING
  14315. C ELSE WEIRD AND JUST DON'T BOTHER WITH THE OPEN.
  14316.     RETURN
  14317.     END
  14318. c -h- recalc.f40    Tue Sep  2 10:58:55 1986    
  14319.     SUBROUTINE RECALC
  14320. C COPYRIGHT (C) 1983,1984,1985,1986 GLENN EVERHART
  14321. C ALL RIGHTS RESERVED
  14322. C RECALCULATE COMMAND
  14323. C RECOMPUTE ALL ELEMENTS OF SPREADSHEET WHERE VALID.
  14324. C NOTE: THROUGHOUT, ROWS ARE ACTUALLY DOWN, COLUMNS ACROSS ON
  14325. C SCREEN. ROW 0 IN DISPLAY IS THE 27 ACCUMULATORS A-Z AND %, WITH
  14326. C % BEING THE LAST-COMPUTED VALUE FROM THE CALC PROGRAM, WHICH
  14327. C KNOWS HOW TO ACCESS THE DATA BUT IS JUST PASSED COMMAND STRINGS
  14328. C FROM THE DISK BASED FILE HERE.
  14329.     Include AParms.inc
  14330.     CHARACTER*1 FORM,FVLD,CMDLIN(132)
  14331.     INTEGER*4 VNLT
  14332. C ***<<< XVXTCD COMMON START >>>***
  14333.     CHARACTER*1 OARRY(100)
  14334.     InTeGer*4 OSWIT,OCNTR
  14335. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  14336. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  14337.     InTeGer*4 IPS1,IPS2,MODFLG
  14338. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  14339.        InTeGer*4 XTCFG,IPSET,XTNCNT
  14340.        CHARACTER*1 XTNCMD(80)
  14341. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  14342. C VARY FLAG ITERATION COUNT
  14343.     INTEGER KALKIT
  14344. C    COMMON/VARYIT/KALKIT
  14345.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  14346.     InTeGer*4 RCMODE,IRCE1,IRCE2
  14347. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  14348. C     1  IRCE2
  14349. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  14350. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  14351. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  14352. C RCFGX ON.
  14353. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  14354. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  14355. C  AND VM INHIBITS. (SETS TO 1).
  14356.     INTEGER*4 FH
  14357. C FILE HANDLE FOR CONSOLE I/O (RAW)
  14358. C    COMMON/CONSFH/FH
  14359.     CHARACTER*1 ARGSTR(52,4)
  14360. C    COMMON/ARGSTR/ARGSTR
  14361.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  14362.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  14363.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  14364.      3  IRCE2,FH,ARGSTR
  14365. C ***<<< XVXTCD COMMON END >>>***
  14366. CCCC    InTeGer*4 FORMFG,RCFGX,PZAP,RCONE,RCMODE,
  14367. CCCC     1  IRCE1,IRCE2
  14368. CCCC    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,
  14369. CCCC     1  IRCE1,IRCE2
  14370. C ***<<< KLSTO COMMON START >>>***
  14371.     InTeGer*4 DLFG
  14372. C    COMMON/DLFG/DLFG
  14373.     InTeGer*4 KDRW,KDCL
  14374. C    COMMON/DOT/KDRW,KDCL
  14375.     InTeGer*4 DTRENA
  14376. C    COMMON/DTRCMN/DTRENA
  14377.     REAL*8 EP,PV,FV
  14378.     DIMENSION EP(20)
  14379.     INTEGER*4 KIRR
  14380. C    COMMON/ERNPER/EP,PV,FV,KIRR
  14381.     InTeGer*4 LASTOP
  14382. C    COMMON/ERROR/LASTOP
  14383.     CHARACTER*1 FMTDAT(9,76)
  14384. C    COMMON/FMTBFR/FMTDAT
  14385.     CHARACTER*1 EDNAM(16)
  14386. C    COMMON/EDNAM/EDNAM
  14387.     InTeGer*4 MFID(2),MFMOD(2)
  14388. C    COMMON/FRM/MFID,MFMOD
  14389.     InTeGer*4 JMVFG,JMVOLD
  14390. C    COMMON/FUBAR/JMVFG,JMVOLD
  14391.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  14392.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  14393. C ***<<< KLSTO COMMON END >>>***
  14394. CCC    InTeGer*4 DLFG
  14395. CCC    COMMON/DLFG/DLFG
  14396. C DLFG=1 IF D## FORMS HAVE BEEN SEEN, ELSE 0
  14397.     DIMENSION FORM(128),FVLD(1,1)
  14398.     COMMON/FVLDC/FVLD
  14399. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  14400. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  14401. C SO INITIALLY IGNORE.
  14402. C FVLD=-2 OR -3 = DISPLAY FORMULA
  14403. C FVLD=3 NUMERIC, COMPUTE ONCE THEN SET FVLD TO 2
  14404. C FVLD=2 NUMERIC CONSTANT, ALREADY COMPUTED... DO NOT RECOMPUTE.
  14405. C
  14406. C ROUTINE IN2AS COMPUTES ASCII CHARACTER NAMES OF SUBSCRIPTS IN1,IN2
  14407. C SO DISPLAY CAN HAVE THEM. IT MUST BE THE INVERSE OF VARSCN.
  14408. C ***<<<< RDD COMMON START >>>***
  14409.     InTeGer*4 RRWACT,RCLACT
  14410. C    COMMON/RCLACT/RRWACT,RCLACT
  14411.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  14412.      1  IDOL7,IDOL8
  14413. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  14414. C     1  IDOL7,IDOL8
  14415.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  14416. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  14417.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  14418. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  14419. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  14420. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  14421.     InTeGer*4 KLVL
  14422. C    COMMON/KLVL/KLVL
  14423.     InTeGer*4 IOLVL,IGOLD
  14424. C    COMMON/IOLVL/IOLVL
  14425. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  14426. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  14427.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  14428.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  14429.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  14430.      3  k3dfg,kcdelt,krdelt,kpag
  14431. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  14432. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  14433. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  14434. C ***<<< RDD COMMON END >>>***
  14435. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  14436. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  14437.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  14438.     COMMON/D2R/NRDSP,NCDSP
  14439.     InTeGer*4 TYPE(1,1),VLEN(9)
  14440.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1)
  14441. CCC    InTeGer*4 RRWACT,RCLACT
  14442. CCC    COMMON/RCLACT/RRWACT,RCLACT
  14443. CCC    InTeGer*4 KDRW,KDCL
  14444. CCC    COMMON /DOT/KDRW,KDCL
  14445.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  14446.     InTeGer*4 PRS,PCS,DRS,DCS
  14447.     Character*6 cwrk6
  14448.     PRS=PROW
  14449.     PCS=PCOL
  14450.     DRS=DROW
  14451.     DCS=DCOL
  14452.     IF(RCMODE.EQ.2)GOTO 5500
  14453. C THE FOLLOWING 2 LOOPS DEFINE ORDER OF CALCULATION.
  14454. C HERE THIS IS: OUTER LOOP ON ROWS (ACROSS), INNER LOOP ON COLUMNS (DOWN).
  14455. C NOTE THAT N2 DEFINES THE SHEET. SINCE 1 IS THE ACCUMULATORS, JUST GO THRU
  14456. C FOR THE SHEET, NOT THE AC'S.
  14457.     DO 1 N2=2,RCLACT
  14458.     IF(IDOL8.EQ.0)GOTO 8220
  14459. C VIEW HACK HERE
  14460. C DISPLAY ROW NUMBER FOLLOWED BY BARE CR DURING RECALC
  14461.     KKKK=13
  14462. C 13 IS ASCII CARRIAGE RETURN
  14463.     write(cwrk6,8221)n2
  14464.     call uvt100(1,llcmd,60)
  14465.     call vwrt(cwrk6,5)
  14466. c    REWIND 11
  14467. c    WRITE(11,8221)N2,KKKK
  14468. c    REWIND 11
  14469. 8221    FORMAT(I5,1A1)
  14470. 8220    CONTINUE
  14471.     N1=1
  14472. 220    CONTINUE
  14473. C    DO 2 N1=1,60
  14474. C USE FVPEEK TO CHECK WHERE FIRST CELL TO DO IS HERE. SHOULD BE
  14475. C FASTER THAN STANDARD LOOP METHOD.
  14476. C *** NOTE HOWEVER THAT IT COULD SLOW US UP... DEPENDS ON EFFICIENCY
  14477. C OF FVLDGT AND FVPEEK.
  14478. C  ... NEED BADLY TO SPEED UP FVLDGT AND FVPEEK TO GET THIS LOOP TO RUN FAST.
  14479. CCCC COMMENT 2 LINES OUT WHEN FAST FVLDGT IS IN TO SPEED UP MORE...
  14480. CCCC EXTRA LOGIC IN FVPEEK DOESN'T USUALLY PAY FOR ITSELF...
  14481. CCC    CALL FVPEEK(N1,N2,NN1)
  14482. CCC    N1=NN1
  14483.     CALL FVLDGT(N1,N2,FVLD(1,1))
  14484.     IIFV=JCHAR(FVLD(1,1))
  14485.     IF (IIFV.LE.0) GOTO 2
  14486.     IRRX=(N2-1)*MCols+N1
  14487. C IF CONSTANT WAS COMPUTED ALREADY, NO NEED TO RECOMPUTE. SKIP IT.
  14488. C NOTE: WE MUST ALWAYS RECOMPUTE IF R COMMAND WAS GIVEN...
  14489.     IF ((RCONE.EQ.0).AND.(ICHAR(FVLD(1,1)).EQ.2)) GOTO 2
  14490.     KDRW=N1
  14491.     KDCL=N2
  14492.     PROW=N1
  14493.     PCOL=N2
  14494. C SEE IF THIS PHYS COL HAS A DISPLAY COL. AND IF SO SET THAT UP.
  14495. C ONLY SET TO DISPLAYED LOCS HERE TO MINIMIZE SEARCH TIME.
  14496. C NEED THIS TO HANDLE D## FORMS...
  14497.     IF (DLFG.EQ.0)GOTO 95
  14498. C IF NEVER HAD A D## FORM FORGET LOOKING FOR DISPLAY LOCS.
  14499.     DO 20 M2=1,DCLV
  14500.     DO 10 M1=1,DRWV
  14501.     M1X=M1
  14502.     M2X=M2
  14503. C LOOK FOR DISPLAY COORDS EVEN IF IN HYPERSPACE
  14504. C WE FIND ONE IF INDEX FROM REFLECT IS SAME AS WHAT
  14505. C WE'RE LOOKING FOR...
  14506.     IF(NRDSP(M1,M2).EQ.N1.AND.NCDSP(M1,M2).EQ.N2)GOTO 9
  14507. 10    CONTINUE
  14508. 20    CONTINUE
  14509. 95    CONTINUE
  14510. C HERE IF CELL NOT DISPLAYED... SEE IF NEEDS DOING IN RI, RE MODES
  14511.     IF(RCMODE.LE.0)GOTO 9
  14512.     IF(PROW.NE.IRCE1.OR.PCOL.NE.IRCE2)GOTO 2
  14513. C SKIP UNLESS ENTER CELL.
  14514. 9    CONTINUE
  14515. C IF NO DISPLAY ROW, LEAVE AT LOW RIGHT...
  14516. C USE SAVED VALUES SO WE DON'T RELY ON DO LOOP INDEX AFTER LOOP END.
  14517.     DROW=M1X
  14518.     DCOL=M2X
  14519.     CALL WRKFIL(IRRX,FORM,0)
  14520. C NOW HAVE THE FORMULA LINE. PASS TO DOENTRY TO HANDLE IT.
  14521.     LFST=1
  14522. C FIND END OF FORMULA FOR MATH ROUTINES TO TRY TO SPEED
  14523. C THEM UP A BIT.
  14524.     DO 56 N=1,109
  14525.     LLST=111-N
  14526.     IF(ICHAR(FORM(LLST-1)).GT.32)GOTO 57
  14527.     FORM(LLST)=Char(0)
  14528. 56    CONTINUE
  14529. 57    CONTINUE
  14530.     FORM(LLST)=Char(0)
  14531.     FORM(111)=Char(0)
  14532. C    IF(ICHAR(FORM(118)).NE.15)GOTO 2
  14533. c ****&&&& experimental...
  14534. c &&&&&**** replace llst by llst-1
  14535. c    llst=max0(1,llst-1)
  14536.     CALL DOENTR(FORM,LFST,LLST)
  14537. C IF WE JUST COMPUTED A CONSTANT, FLAG IT COMPUTED AND SKIP IT.
  14538. C    CALL FVLDGT(N1,N2,FVLD(1,1))
  14539.     IF(IIFV.EQ.3)CALL FVLDST(N1,N2,Char(2))
  14540. 2    CONTINUE
  14541.     N1=N1+1
  14542.     IF(N1.LE.RRWACT)GOTO 220
  14543. 1    CONTINUE
  14544.     GOTO 5600
  14545. 5500    CONTINUE
  14546. C RCMODE=2 AND NOT RM MODE
  14547. C (IN RM MODE, RECALC IS NOT CALLED...)
  14548.     DO 1701 M2=1,DCLV
  14549.     IF(IDOL8.EQ.0)GOTO 8222
  14550. C VIEW HACK HERE
  14551. C DISPLAY ROW NUMBER FOLLOWED BY BARE CR DURING RECALC
  14552.     KKKK=13
  14553. C 13 IS ASCII CARRIAGE RETURN
  14554.     write(cwrk6,8221)n2
  14555.     call uvt100(1,llcmd,60)
  14556.     call vwrt(cwrk6,5)
  14557. C 13 IS ASCII CARRIAGE RETURN
  14558. c    REWIND 11
  14559. c    WRITE(11,8221)M2,KKKK
  14560. c    REWIND 11
  14561. 8222    CONTINUE
  14562.     KDRW=1
  14563.     KDCL=2
  14564.     DO 1702 M1=1,DRWV
  14565. C TO HANDLE DISPLAY WHEREVER IT MAY BE, FIND ID OF PHYS CELL AND
  14566. C CONVERT TO PHYS ROW, COL AGAIN REGARDLESS OF ALIAS...
  14567. C (NOTE CALC ORDER IS THEREFORE DISPLAY ORDER, NOT SHEET ORDER...)
  14568.     K=NRDSP(M1,M2)
  14569.     KK=NCDSP(M1,M2)
  14570.     CALL REFLECT(KK,K,IV1)
  14571.     NRC=IV1-1
  14572.     N1=MOD(NRC,MCols)+1
  14573.     N2=((NRC-N1+1)/MCols)+1
  14574. C COMPUTE PHYS ROW, COL FROM DISPLAY COORDINATES.
  14575. C USE FVPEEK TO CHECK WHERE FIRST CELL TO DO IS HERE. SHOULD BE
  14576. C FASTER THAN STANDARD LOOP METHOD.
  14577. C *** NOTE HOWEVER THAT IT COULD SLOW US UP... DEPENDS ON EFFICIENCY
  14578. C OF FVLDGT AND FVPEEK.
  14579. C  ... NEED BADLY TO SPEED UP FVLDGT AND FVPEEK TO GET THIS LOOP TO RUN FAST.
  14580.     If (N1.gt.RRWACT.or.N2.Gt.RCLACT) GOTO 1702
  14581.     CALL FVLDGT(N1,N2,FVLD(1,1))
  14582.     IIFV=JCHAR(FVLD(1,1))
  14583.     IF (IIFV.LE.0) GOTO 1702
  14584. C FORGET THIS CELL IF NOT A COMPUTABLE ONE...
  14585.     IRRX=IV1
  14586. C IF CONSTANT WAS COMPUTED ALREADY, NO NEED TO RECOMPUTE. SKIP IT.
  14587. C NOTE: WE MUST ALWAYS RECOMPUTE IF R COMMAND WAS GIVEN...
  14588.     IF ((RCONE.EQ.0).AND.(ICHAR(FVLD(1,1)).EQ.2)) GOTO 1702
  14589.     KDRW=N1
  14590.     KDCL=N2
  14591.     PROW=N1
  14592.     PCOL=N2
  14593.     DROW=M1
  14594.     DCOL=M2
  14595.     CALL WRKFIL(IRRX,FORM,0)
  14596. C NOW HAVE THE FORMULA LINE. PASS TO DOENTRY TO HANDLE IT.
  14597.     LFST=1
  14598. C FIND END OF FORMULA FOR MATH ROUTINES TO TRY TO SPEED
  14599. C THEM UP A BIT.
  14600. C (ALSO GUARANTEE WE HAVE LOTS OF NULLS AT END TO TERMINATE INDEX ROUTINES)
  14601.     DO 756 N=1,109
  14602.     LLST=111-N
  14603.     IF(ICHAR(FORM(LLST-1)).GT.32)GOTO 757
  14604.     FORM(LLST)=Char(0)
  14605. 756    CONTINUE
  14606. 757    CONTINUE
  14607.     FORM(LLST)=Char(0)
  14608.     FORM(111)=Char(0)
  14609. C CALL DOENTR TO DO THE ACTUAL COMPUTATION WORK...
  14610.     CALL DOENTR(FORM,LFST,LLST)
  14611. C IF WE JUST COMPUTED A CONSTANT, FLAG IT COMPUTED AND SKIP IT.
  14612.     IF(IIFV.EQ.3)CALL FVLDST(N1,N2,Char(2))
  14613. 1702    CONTINUE
  14614. 1701    CONTINUE
  14615. C END OF COMPUTATION OVER DISPLAYS
  14616. C    GOTO 5600
  14617. 5600    CONTINUE
  14618.     PROW=PRS
  14619.     PCOL=PCS
  14620.     DROW=DRS
  14621.     DCOL=DCOL
  14622. C FORCE FUNCTION WORKS ONCE ONLY.
  14623.     RCONE=0
  14624.     RCMODE=IABS(RCMODE)
  14625. C SET FOR TEMP. RECALC-ALL MODES TO RETURN TO NORMAL.
  14626.     IRCE1=0
  14627.     IRCE2=0
  14628.     RETURN
  14629.     END
  14630. c -h- reflect.f40    Tue Sep  2 10:58:55 1986    
  14631.     SUBROUTINE REFLEC(ID1,ID2,ID)
  14632. C FORM ID OUT OF ID1,ID2 BUT USING REFLECTED VALUES SO THAT
  14633. C RESULT ID IS ALWAYS IN PRIME AREA.
  14634.     Include AParms.inc
  14635.     InTeGer*4 ID,ID1,ID2,IDD1,IDD2
  14636. C ***<<< NULETC COMMON START >>>***
  14637.     InTeGer*4 ICREF,IRREF
  14638. C    COMMON/MIRROR/ICREF,IRREF
  14639.     InTeGer*4 MODPUB,LIMODE
  14640. C    COMMON/MODPUB/MODPUB,LIMODE
  14641.     InTeGer*4 KLKC,KLKR
  14642.     REAL*8 AACP,AACQ
  14643. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  14644.     InTeGer*4 NCEL,NXINI
  14645. C    COMMON/NCEL/NCEL,NXINI
  14646.     CHARACTER*1 NAMARY(20,MRows)
  14647. C    COMMON/NMNMNM/NAMARY
  14648.     InTeGer*4 NULAST,LFVD
  14649. C    COMMON/NULXXX/NULAST,LFVD
  14650.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  14651.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  14652. C ***<<< NULETC COMMON END >>>***
  14653. CCC    COMMON/MIRROR/ICREF,IRREF
  14654. C IN RECALC WE MOVE OVER PRIME AREA ONLY AND SEARCH FOR CELLS IN
  14655. C DISPLAY AREA THERE. THIS IMPLIES THAT WE DON'T FIND DISPLAY
  14656. C COORDS OF CELLS IN EXTENDED AREAS THERE.  THEREFORE THE RI AND RE
  14657. C MODES FAIL COMPLETELY THERE. SINCE WE WANT THE SYSTEM TO WORK IN
  14658. C A PREDICTABLE WAY, FORCE RECALC MODE (I.E., R OR RM MODES) THERE TO
  14659. C ALLOW CELLS TO BE COMPUTED.
  14660. C NOTE THAT IF WE ARE IN THE PRIME AREA AND ISSUE AN RE OR RI COMMAND,
  14661. C THAT MODE SHOULD STAY SET SO LONG AS WE STAY THERE SINCE THE RE OR
  14662. C RI MODES WILL INHIBIT COMPUTING OUTSIDE THAT AREA (AS LONG AS NOTHING
  14663. C REFLECTS INTO IT) SO THERE WILL BE NO REASON FOR THIS TO BE CALLED
  14664. C TO REFLECT SOMETHING BACK TO PRIME AREA UNTIL A R COMMAND IS GIVEN
  14665. C OR THE DISPLAY MOVES OFF THE EDGE OF THE PRIME 60 BY 301 AREA.
  14666. C
  14667. C ***<<< XVXTCD COMMON START >>>***
  14668.     CHARACTER*1 OARRY(100)
  14669.     InTeGer*4 OSWIT,OCNTR
  14670. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  14671. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  14672.     InTeGer*4 IPS1,IPS2,MODFLG
  14673. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  14674.        InTeGer*4 XTCFG,IPSET,XTNCNT
  14675.        CHARACTER*1 XTNCMD(80)
  14676. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  14677. C VARY FLAG ITERATION COUNT
  14678.     INTEGER KALKIT
  14679. C    COMMON/VARYIT/KALKIT
  14680.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  14681.     InTeGer*4 RCMODE,IRCE1,IRCE2
  14682. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  14683. C     1  IRCE2
  14684. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  14685. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  14686. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  14687. C RCFGX ON.
  14688. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  14689. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  14690. C  AND VM INHIBITS. (SETS TO 1).
  14691.     INTEGER*4 FH
  14692. C FILE HANDLE FOR CONSOLE I/O (RAW)
  14693. C    COMMON/CONSFH/FH
  14694.     CHARACTER*1 ARGSTR(52,4)
  14695. C    COMMON/ARGSTR/ARGSTR
  14696.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  14697.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  14698.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  14699.      3  IRCE2,FH,ARGSTR
  14700. C ***<<< XVXTCD COMMON END >>>***
  14701. CCC    InTeGer*4 FORMFG,RCFGX,PZAP,RCONE,RCMODE
  14702. CCC    InTeGer*4 IRCE1,IRCE2
  14703. CCC    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,IRCE2
  14704.     IDD1=MAX0(ID1,1)
  14705.     IDD2=ID2
  14706. C ACCEPT TRICK CALLS WITH ID1=0 AS FROM GMSUBS, MTXEQU,
  14707. C AND MDST
  14708.     IF(ID1.LT.1)GOTO 2000
  14709. 4000    CONTINUE
  14710.     IF(IDD2.LE.MCols)GOTO 1000
  14711.     IDD2=IDD2-MCols
  14712.     IDD1=IDD1+IRREF
  14713. c    RCMODE=0
  14714. C RI AND RE MODES FAIL OUT OF PRIME AREA SO DISABLE THEM
  14715.     GOTO 4000
  14716. 1000    CONTINUE
  14717.     IF(IDD1.LE.MRows)GOTO 2000
  14718.     IDD1=IDD1-MRows+1
  14719.     IDD2=IDD2+ICREF
  14720. c    RCMODE=0
  14721. C RI AND RE MODES FAIL OUT OF PRIME AREA SO DISABLE THEM
  14722.     GOTO 4000
  14723. 2000    CONTINUE
  14724.     ID=(IDD1-1)*MCols+IDD2
  14725.     RETURN
  14726.     END
  14727. c -h- relvbl.for    Tue Sep  2 10:58:55 1986    
  14728.     SUBROUTINE RELVBL(LNIN,LNOUT,INRW,INCL,JOUTR,JOUTC,JRTR,JRTC)
  14729. C RELOCATE VARIABLES BELOW/RIGHT OF JRTR,JRTC INTO LNOUT FROM LNIN
  14730. C    PARAMETER CUP=1,ED=11,EL=12
  14731.     Include AParms.inc
  14732.     CHARACTER*1 NAME(4),NUMBER(6)
  14733.     CHARACTER*1 LNIN,LNOUT
  14734.     CHARACTER*6 NUMBR6
  14735.     EQUIVALENCE(NUMBR6(1:1),NUMBER(1))
  14736.     DIMENSION LNIN(128),LNOUT(128)
  14737. C ***<<<< RDD COMMON START >>>***
  14738.     InTeGer*4 RRWACT,RCLACT
  14739. C    COMMON/RCLACT/RRWACT,RCLACT
  14740.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  14741.      1  IDOL7,IDOL8
  14742. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  14743. C     1  IDOL7,IDOL8
  14744.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  14745. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  14746.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  14747. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  14748. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  14749. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  14750.     InTeGer*4 KLVL
  14751. C    COMMON/KLVL/KLVL
  14752.     InTeGer*4 IOLVL,IGOLD
  14753. C    COMMON/IOLVL/IOLVL
  14754. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  14755.     Integer*4 K3dfg,kcdelt,krdelt,kpag,idol9,idsptp
  14756. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  14757.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  14758.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  14759.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,Idsptp,Idol9,
  14760.      3  k3dfg,kcdelt,krdelt,kpag
  14761. C ***<<< RDD COMMON END >>>***
  14762. CCC    InTeGer*4 IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  14763. CCC    COMMON/DOLLR/IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  14764. C    LOGICAL*2 L63,L192,L255,L127,L128
  14765.     LOGICAL*4 L1,L2
  14766. C    InTeGer*4 I63,I192,I255,I127,I128
  14767.     InTeGer*4 I63,I192,I127
  14768.     InTeGer*4 I1,I2
  14769. C    EQUIVALENCE(I63,L63),(I192,L192),(I255,L255)
  14770.     EQUIVALENCE (I1,L1),(I2,L2)
  14771. C    EQUIVALENCE (L127,I127),(L128,I128)
  14772. C    DATA I63/63/,I192/192/,I255/255/,I127/127/,I128/128/
  14773.     DATA I63/63/,I192/192/,I127/127/
  14774.     LI=1
  14775.     LO=1
  14776. C LI = INPUT LOCATION
  14777. C LO=OUTPUT LOCATION
  14778. 100    CONTINUE
  14779.     KSheet=0
  14780. C    IF(LNIN(LI).LT.'A'.OR.LNIN(LI).GT.'Z')GOTO 200
  14781.     LCC=ICHAR(LNIN(LI))
  14782. C IF WE HAVE 255,CODE,CODE THEN RELOCATE IN BINARY...
  14783.     IF(LCC.EQ.255)GOTO 500
  14784.     IF(LCC.LT.65.OR.LCC.GT.89)GOTO 200
  14785. C WE MUST ENSURE VARSCN ALWAYS SEES AN ALPHA AT START.
  14786.     IL1=LI
  14787.     LE=110
  14788.     LSTC=LE
  14789.     CALL VARSCN(LNIN,IL1,LE,LSTC,ID1,ID2,IVLD)
  14790. C AVOID MESSING UP FUNCTION NAMES
  14791.     IF(ID2.EQ.1)IVLD=0
  14792. C    IF(ID2.EQ.1.AND.ID1.LE.27)IVLD=0
  14793.     IF(IVLD.EQ.0)GOTO 200
  14794. C FOUND VARIABLE. NOW GENERATE ASCII ANDSTUFF INTO OUTPUT.
  14795. C FIRST DON'T RELOCATE P## AND D## FORMS.
  14796.     IF(LNIN(LI+1).EQ.'#')GOTO 250
  14797. C RELOCATE NORMAL VARIABLE HERE.
  14798. C
  14799. C THE NEW VARIABLE IS TO BE DIFFERENT ONLY IF (ID1,ID2) HAS
  14800. C ID1.GT.JRTR AND ID2.GT.JRTC
  14801.     IF(ID1.LT.JRTR.OR.ID2.LT.JRTC)GOTO 210
  14802.     IF(ID1.GT.IDOL5.OR.ID2.GT.IDOL6)GOTO 210
  14803. C OK, KNOW NOW THAT WE HAVE TO RELOCATE ALL.
  14804. C THEREFORE ADD THE DIFFERENCE BETWEEN DEST AND SRC TO BOTH
  14805. C AND CLAMP TO VALID DIMENSIONS.
  14806.     IF(IDOL3.NE.0.OR.IDOL1.EQ.0)ID1=ID1+(JOUTR-INRW)
  14807.     IF(IDOL3.NE.0.OR.IDOL2.EQ.0)ID2=ID2+(JOUTC-INCL)
  14808. 906    ID1=MAX0(ID1,1)
  14809.     ID2=MAX0(ID2,1)
  14810. C CAN UNPACK THIS STUFF ALL RIGHT IN EXTENDED WAYS.
  14811.     ID1=MIN0(MRC,ID1)
  14812.     ID2=MIN0(MRC,ID2)
  14813. 210    CONTINUE
  14814.     KSHEET=0
  14815.     IF(K3DFG.LE.2)GOTO 2221
  14816. C RENAME CELLS BY 3D NAMES. (NOTE FLAG TO DO THIS; USE FOR DISPLAYS)
  14817. C ID1 GETS REDUCED BY COL. DELTA AND ID2 BY ROW DELTA
  14818. C UNTIL ONE OR BOTH ARE LESS THAN THE DELTAS. THEN THE %NNNN IS TACKED ON
  14819. C THE END. THIS PERMITS USERS TO DECIDE WHETHER THEY WANT THINGS TRANSLATED
  14820. C TO SHEET NUMBER FORMAT OR NOT.
  14821.     IF(KCDELT.LE.0.AND.KRDELT.LE.0)GOTO 2221
  14822.     KRR1=MRC
  14823.     KCC1=MRC
  14824.     IF(KCDELT.GT.0)KCC1=(ID1-1)/KCDELT
  14825.     IF(KRDELT.GT.0)KRR1=(ID2-2)/KRDELT
  14826.     KSH=MIN0(KRR1,KCC1)
  14827.     IF(KSH.GE.(MRC-100))GOTO 2221
  14828. C IF BOTH DELTAS ARE ZERO DON'T TOUCH ANYTHING.
  14829.     KSHEET=MAX0(KSH,0)
  14830. C KSHEET NONZERO FLAGS WE MAKE THE MOD
  14831.     IF(ID1.LT.KSHEET*KCDELT)GOTO 2220
  14832.     IF((ID2-1).LT.KSHEET*KRDELT)GOTO 2220
  14833.     ID1=ID1-KSHEET*KCDELT
  14834.     ID2=ID2-KSHEET*KRDELT
  14835. c222    CONTINUE
  14836.     GOTO 2221
  14837. 2220    CONTINUE
  14838.     KSHEET=0
  14839. 2221    CONTINUE
  14840.     CALL IN2AS(ID1,NAME)
  14841. C NAME GETS 4 CHARACTERS TO USE FOR COL. LABEL
  14842.     IL2=ID2-1
  14843.     WRITE(NUMBR6(1:6),1000)IL2
  14844. C    ENCODE(6,1000,NUMBER)IL2
  14845. 1000    FORMAT(I6)
  14846. C NOW NAME AND NUMBER ARRAYS HAVE LETTERS, DIGITS, OR SPACES.
  14847. C THROW OUT SPACES AND COPY THE REST.
  14848.     LI=LSTC
  14849.     DO 202 N=1,4
  14850.     IF(Ichar(NAME(N)).LE.32)GOTO 202
  14851.     LNOUT(LO)=NAME(N)
  14852.     LO=LO+1
  14853.     IF(LO.GT.110)GOTO 300
  14854. 202    CONTINUE
  14855.     IF(IDOL1.GT.0)LNOUT(LO)=36
  14856.     IF(IDOL1.GT.0.AND.LO.LE.109)LO=LO+1
  14857.     DO 203 N=1,6
  14858.     IF(ICHAR(NUMBER(N)).LE.32)GOTO 203
  14859. C IF 32 ISN'T SPACE, LOSE
  14860.     LNOUT(LO)=NUMBER(N)
  14861.     LO=LO+1
  14862.     IF(LO.GT.110)GOTO 300
  14863. 203    CONTINUE
  14864.     IF(IDOL2.EQ.0)GOTO 275
  14865.     LNOUT(LO)=Char(36)
  14866.     IF(LO.LE.109)LO=LO+1
  14867. 275    Continue
  14868.     IF(KSHEET.EQ.0)GOTO 300
  14869. C ADD SHEET NUMBER CRUFT IF CALLED FOR.
  14870.     LNOUT(LO)=Char(37)
  14871. C 37 IS % SIGN
  14872.     IF(LO.LE.109)LO=LO+1
  14873.     NUMBR6(1:6)='      '
  14874.     WRITE(NUMBR6(1:6),1000)KSHEET
  14875. C    ENCODE(6,1000,NUMBER)KSHEET
  14876.     DO 1203 N=1,6
  14877.     IF(Ichar(NUMBER(N)).LE.32)GOTO 1203
  14878. C IF 32 ISN'T ASCII SPACE, LOSE.
  14879.     LNOUT(LO)=NUMBER(N)
  14880.     LO=LO+1
  14881.     IF(LO.GT.110)GOTO 300
  14882. 1203    CONTINUE
  14883. C NOW HAVE THE FULL VALUE ENCODED, INCLUDING SHEET NUMBER IF APPROPRIATE.
  14884. c    IF(LO.LE.109)LO=LO+1
  14885.     GOTO 300
  14886. 250    CONTINUE
  14887. C JUST COPY DISPLAY FORMS.
  14888.     IL1=LSTC-1
  14889.     DO 251 N=LI,IL1
  14890.     LNOUT(LO)=LNIN(N)
  14891.     LO=LO+1
  14892.     IF(LO.GT.110)GOTO 300
  14893. 251    CONTINUE
  14894.     LI=LSTC
  14895. C THIS SKIPS OVER THE VARIABLE FOUND, SO WE GO ON.
  14896.     GOTO 300
  14897. 200    LNOUT(LO)=LNIN(LI)
  14898.     LO=LO+1
  14899.     LI=LI+1
  14900. 300    IF(LO.LT.109.AND.LI.LT.109)GOTO 100
  14901. C THIS LOOPS EITHER COPYING LINE OR FINDING VARIABLES TILL DONE.
  14902.     LO=MIN0(LO,110)
  14903.     DO 400 N=LO,110
  14904. 400    LNOUT(N)=0
  14905.     DO 1 N=111,128
  14906. 1    LNOUT(N)=LNIN(N)
  14907. C DEFAULT ALL OF FORM LINES EXCEPT FORMULA IDENTICAL TO THE INPUT.
  14908.     RETURN
  14909. 500    CONTINUE
  14910. C DECODE BY HAND...
  14911.     LNOUT(LO)=LNIN(LI)
  14912.     I1=ICHAR(LNIN(LI+1))
  14913.     I2=IMASK(I1,I192)
  14914. C    L2=L1.AND.L192
  14915.     I1=IMASK(I1,I63)
  14916. C    L1=L1.AND.L63
  14917. C DO MASKING TO GET BINARY COORDS
  14918.     ID1=I1
  14919.     I1=ICHAR(LNIN(LI+2))
  14920.     I1=IMASK(I1,I127)
  14921. C    L1=L1.AND.L127
  14922.     ID2=I2*2+I1
  14923. C NOW RELOCATE AND PUT BACK
  14924.     IF(ID1.LT.JRTR.OR.ID2.LT.JRTC)GOTO 510
  14925.     IF(ID1.GT.IDOL5.OR.ID2.GT.IDOL6)GOTO 510
  14926.     IF(IDOL3.NE.0.OR.IDOL1.EQ.0)ID1=ID1+(JOUTR-INRW)
  14927.     IF(IDOL3.NE.0.OR.IDOL2.EQ.0)ID2=ID2+(JOUTC-INCL)
  14928. C CLAMP RESULT TO MAX RANGES
  14929.     ID1=MAX0(ID1,1)
  14930.     ID2=MAX0(ID2,1)
  14931. C DO GENERAL REPACK IF ID1 OR ID2 ARE EXTENDED RANGE.
  14932.     IF(ID1.GT.60.OR.ID2.GT.301)GOTO 905
  14933. C leave 60, 301 literals here since this controls repacking
  14934. C    ID1=MIN0(60,ID1)
  14935. C    ID2=MIN0(301,ID2)
  14936. 510    CONTINUE
  14937. C RELOCATED, NOW REPACK AS NEW BINARY PATTERNS
  14938.     I1=ID1
  14939. C    L1=L1.AND.L63
  14940.     I1=IMASK(I1,I63)
  14941.     I2=ID2/2
  14942.     I2=IMASK(I2,I192)
  14943. C    L2=L2.AND.L192
  14944. C    L1=L1.OR.L2
  14945.     I1=I1+I2
  14946.     LNOUT(LO+1)=CHAR(I1)
  14947.     I2=ID2
  14948.     I2=IMASK(I2,I127)+128
  14949. C    L2=L2.AND.L127
  14950. C    L2=L2.OR.L128
  14951. C BE SURE AT LEAST 1 BIT IS SET
  14952.     LNOUT(LO+2)=CHAR(I2)
  14953.     LI=MIN0(109,LI+3)
  14954.     LO=MIN0(109,LO+3)    
  14955. C GO LOOK FOR MORE TO DECODE
  14956.     GOTO 300
  14957. 905    CONTINUE
  14958. C HERE SET UP FOR REENTRY INTO "NORMAL" DECODE
  14959.     LSTC=MIN0(109,LI+3)
  14960.     GOTO 906
  14961.     END
  14962. c -h- rnd.for    Tue Sep  2 10:58:55 1986    
  14963.     FUNCTION RND(DUM)
  14964. C GENERATE RANDOM NUMBER BY LINEAR CONGRUENCE IN BIG
  14965. C INTEGERS.
  14966.     REAL*4 R
  14967.     INTEGER*4 DUM
  14968.     INTEGER*4 I,II
  14969.     LOGICAL*4 L,LMSK
  14970.     REAL*8 XX
  14971.     EQUIVALENCE(I,L),(II,LMSK)
  14972.     I=DUM
  14973.     XX=I
  14974.     XX=XX*214013.0D0+2531011.0D0
  14975.     IF(XX.LT.0.)XX=1.0D0-XX
  14976.     XX=DMOD(XX,16777216.0D0)
  14977.     I=IDINT(XX)
  14978. C    I=I*214013+2531011
  14979. C USE MASKING TO ZOT THIS INTO NORMAL RANGE
  14980. C JUST USE MODULO...
  14981.     IF(I.LT.0)I=1-I
  14982.     IF(I.LT.0)I=0
  14983.     I=MOD(I,16777215)
  14984.     DUM=I
  14985. C RETURN RANDOM BETWEEN 0 AND 1.0
  14986. C PERIOD OF 2**24 MAX
  14987.     XX=I
  14988.     XX=XX/16777216.0
  14989.     R=SNGL(XX)
  14990.     RND=R
  14991.     RETURN
  14992.     END
  14993. c -h- rvboo.for    Tue Sep  2 10:58:55 1986    
  14994.     SUBROUTINE RVBOO(RETV,ID1,ID2)
  14995. C THIS ROUTINE ONLY COPIES ID1,ID2 INTO RETV ARRAY TO AVOID SOME
  14996. C BYTE-INTEGER CONVERSION PROBLEMS. THIS PACKING IS USED TO
  14997. C ACCESS VARIABLE LOCATION LATER.
  14998.     InTeGer*4 RETV,ID1,ID2
  14999.     DIMENSION RETV(2)
  15000.     RETV(1)=ID1
  15001.     RETV(2)=ID2
  15002.     RETURN
  15003.     END
  15004. c -h- scmp.for    Tue Sep  2 10:58:55 1986    
  15005.     SUBROUTINE SCMP(LINA,LINB,LENM,ICODE)
  15006.     DIMENSION LINA(1),LINB(1)
  15007.     CHARACTER*1 LINA,LINB
  15008.     ICODE=1
  15009.     DO 1 N=1,LENM
  15010.     IF(ICHAR(LINA(N)).EQ.0.OR.ICHAR(LINB(N)).EQ.0)GOTO 2
  15011. C ALLOW _ TO BE A WILDCARD.
  15012.     IF(LINA(N).EQ.'_'.OR.LINB(N).EQ.'_')GOTO 1
  15013.     IF(LINA(N).NE.LINB(N))ICODE=0
  15014.     IF(ICODE.NE.1)GOTO 2
  15015. 1    CONTINUE
  15016. 2    CONTINUE
  15017.     RETURN
  15018.     END
  15019. c -h- sed.for    Tue Sep  2 10:58:55 1986    
  15020.     SUBROUTINE SED(LCMD,LIN,LWRK,ARGSTR,XAC,LENGTH)
  15021.     CHARACTER*1 LIN(1),LWRK(1),ARGSTR(52,4)
  15022.     CHARACTER*1 LCMD(1),LSU(10)
  15023.     EXTERNAL INDX
  15024.     CHARACTER*10 LSU10
  15025.     EQUIVALENCE (LSU10(1:10),LSU(1))
  15026.     INTEGER*4 III
  15027.     REAL*8 XAC
  15028. C
  15029. C OPERATION:
  15030. C EDIT LIN TO LWRK, WITH LENGTH VARIABLE HOLDING INPUT
  15031. C LENGTH IN CHARACTERS. LCMD HOLDS COMMAND LINE, WHICH
  15032. C ULTIMATELY GETS EDITED STRING COPIED BACK INTO IT.
  15033. C
  15034. C EDITS:
  15035. C  CHARACTER AT IDELIM IS DELIMITER. REPLACE STRING IN 1ST
  15036. C INTERVAL BETWEEN DELIMITERS WITH SECOND.
  15037. C  HOWEVER:
  15038. C  &1 TO &4 GET CONTENTS (UP TO NULL) OF ARGSTR(X,1) TO (X,4)
  15039. C
  15040. C  &5 RETURNS XAC VALUE CONVERTED TO DECIMAL INTEGER AND
  15041. C  PRINTED.
  15042. C  &6 RETURNS XAC VALUE CONVERTED TO ASCII CODE (1 BYTE) AND
  15043. C  INSERTED.
  15044. C XAC ENTERS WITH CONTENTS OF ACCUMULATOR Z (TO AVOID TOO MUCH
  15045. C DIFFICULTY IN USING IT OWING TO THE UBIQUITY OF USE OF %).
  15046. C    WE ENTER JUST POINTING AT THE COMMAND LINE AFTER THE ENTER
  15047. C AND ITS SPACE. ASSUME 1ST CHARACTER IS OUR DELIMITER.
  15048.     DO 335 IV=1,80
  15049. 335    LWRK(IV)=Char(0)
  15050.     IDELIM=ICHAR(LCMD(1))
  15051.     ID2=INDX(LCMD(2),IDELIM)
  15052.     IF(ID2.GE.LENGTH)GOTO 100
  15053. C NOW HAVE 1ST STRING, OF NONZERO LENGTH
  15054. C FIND SECOND STRING NOW. EITHER MAY BE OF 0 LENGTH BUT
  15055. C BOTH MUST BE DEFINED BY A DELIMITER.
  15056.     ID3=INDX(LCMD(2+ID2),IDELIM)
  15057.     IF(ID3.GE.LENGTH)GOTO 100
  15058. C WELL, WE GOT IT SOMEHOW. NOW TRY AND EDIT THE JUNK IN.
  15059. C (NOTE WE WANT TO FILL ALL OF LENGTH)
  15060.     INLIN=1
  15061.     INWRK=1
  15062.     IVV=ID3+ID2+2
  15063.     DO 336 IV=IVV,LENGTH
  15064. 336    LCMD(IV)=Char(0)
  15065.     LSA=ID2-1
  15066.     LSB=ID3-1
  15067.     LSSB=2+ID2
  15068.     LZR=0
  15069.     DO 1 N=1,LENGTH
  15070.     IF(LSA.GT.0)GOTO 350
  15071. C ZERO LENGTH INITIAL STRING, SO ASSUME HE WANTS TO APPEND TO
  15072. C EXISTING STRING AT THE END.
  15073. C (HANDY FOR ADDING TO FORMULAE OR THE LIKE.)
  15074.     IF(Ichar(LIN(N)).EQ.0)GOTO 351
  15075. C JUST COPY THE INPUT FIRST AND GO OFF
  15076.     GOTO 2
  15077. 351    CONTINUE
  15078. C HERE WE HAVE THE TERMINAL NULL
  15079.     LZR=LZR+1
  15080. C ALLOW US TO PRETEND FOR ONCE THAT WE GOT A MATCH
  15081.     IF(LZR.EQ.1)GOTO 222
  15082.     GOTO 1
  15083. 350    CONTINUE
  15084.     IF(Ichar(LIN(INLIN)).EQ.0)GOTO 1
  15085.     CALL SSCMP(LIN(INLIN),LCMD(2),LSA,ICOD)
  15086.     IF(ICOD.EQ.0)GOTO 2
  15087. C HERE HAVE TO SUBSTITUTE
  15088. C PASS STRING TO SUBSTITUTE ON INPUT LINE FIRST.
  15089. 222    CONTINUE
  15090.     INLIN=INLIN+LSA
  15091. C ALLOW ZERO LENGTH SUBSTITUTE CHARACTER
  15092.     IF(LSB.LE.0)GOTO 1
  15093. C    DO 6 M=1,LSB
  15094.     M=1
  15095. 106    CONTINUE
  15096.     IF(LCMD(LSSB+M-1).EQ.'&')GOTO 7
  15097. 8    CONTINUE
  15098. C JUST COPY ONE CHARACTER OF THE SUBSTITUTE STRING IN HERE.
  15099.     LWRK(INWRK)=LCMD(LSSB+M-1)
  15100.     IF(INWRK.LT.LENGTH)INWRK=INWRK+1
  15101.     GOTO 6
  15102. 7    CONTINUE
  15103. C HANDLE & FORMS
  15104.     IF(LCMD(LSSB+M).LT.'1'.OR.LCMD(LSSB+M).GT.'6')GOTO 8
  15105. C REQUIRE ALL FORMS TO BE &1 THRU &6 TO BE DEALT WITH HERE.
  15106.     M=M+1
  15107.     IF(LCMD(LSSB+M-1).GT.'4')GOTO 10
  15108. C HERE JUST HANDLE ARGSTR SUBSTITUTIONS.
  15109.     II=ICHAR(LCMD(LSSB+M-1))
  15110.     II=II-48
  15111. C II IS NOW THE INDEX.
  15112.     DO 11 MM=1,52
  15113.     LWRK(INWRK)=ARGSTR(MM,II)
  15114.     IF(INWRK.LT.LENGTH)INWRK=INWRK+1
  15115.     IF(ARGSTR(MM,II).EQ.0)GOTO 12
  15116. 11    CONTINUE
  15117. 12    CONTINUE
  15118.     M=M+1
  15119. C PASS THE NUMBER OF THE &NUMBER FORM
  15120.     GOTO 6
  15121. 10    CONTINUE
  15122. C HANDLE ZAC FORMS
  15123.     M=M+1
  15124. C PASS THE DIGIT
  15125.     IF(LCMD(LSSB+M-2).EQ.'5')GOTO 14
  15126. C FILL IN ZAC AS AN INTEGER
  15127.     II=32
  15128.     IF(XAC.GE.1.AND.XAC.LT.256.)II=XAC
  15129. C ONLY HANDLE CONVERSION IF LEGAL
  15130.     LWRK(INWRK)=CHAR(II)
  15131.     IF(INWRK.LT.LENGTH)INWRK=INWRK+1
  15132.     GOTO 6
  15133. 14    CONTINUE
  15134. C HANDLE NUMERIC CONVERSION HERE
  15135.     LSU(1)=0
  15136.     III=0
  15137.     IF(DABS(XAC).LT.9999999.)III=IDINT(XAC)
  15138.     WRITE(LSU10(1:10),15,ERR=22)III
  15139. C    ENCODE(10,15,LSU,ERR=22)III
  15140. 15    FORMAT(I9)
  15141. 22    DO 16 MK=1,10
  15142.     IF(Ichar(LSU(MK)).EQ.0)GOTO 6
  15143.     IF(LSU(MK).EQ.' ')GOTO 16
  15144.     LWRK(INWRK)=LSU(MK)
  15145.     IF(INWRK.LT.LENGTH)INWRK=INWRK+1
  15146. 16    CONTINUE
  15147. 6    CONTINUE
  15148.     M=M+1
  15149.     IF(M.LE.LSB)GOTO 106
  15150.     GOTO 1
  15151. 2    CONTINUE
  15152. C HERE JUST ANOTHER CHARACTER TO MOVE, DO THE MOVE.
  15153.     LWRK(INWRK)=LIN(INLIN)
  15154.     IF(INLIN.LT.LENGTH)INLIN=INLIN+1
  15155.     IF(INWRK.LT.LENGTH)INWRK=INWRK+1
  15156. 1    CONTINUE
  15157. C COPY BACK OUT TO CMDLIN AFTER FIXUP
  15158.     IF(INWRK.GE.LENGTH)GOTO 3
  15159.     DO 4 N=INWRK,LENGTH
  15160. 4    LWRK(N)=0
  15161. 3    CONTINUE
  15162. C REPLACE COMMAND LINE WITH EDITED STRING FOR ENTRY NOW.
  15163.     DO 5 N=1,LENGTH
  15164. 5    LCMD(N)=LWRK(N)
  15165. 100    CONTINUE
  15166.     RETURN
  15167.     END
  15168. c -h- sign.for    Tue Sep  2 10:58:55 1986    
  15169.     REAL *8 FUNCTION SIGN(VAR)
  15170.     REAL*8 VAR
  15171. C ALWAYS RETURN 1. OR -1. FOR THIS PROGRAM ... NEVER 0.
  15172.     SIGN=1.
  15173.     IF(VAR.LT.0.)SIGN=-1.
  15174.     RETURN
  15175.     END
  15176. c -h- slend.for    Tue Sep  2 10:58:55 1986    
  15177.     SUBROUTINE SLEND(RETCD)
  15178. C COPYRIGHT (C) 1983, 1984 GLENN AND MARY EVERHART
  15179. C ALL RIGHTS RESERVED
  15180. C 60=MAX REAL ROWS
  15181. C 301=MAX REAL COLS
  15182. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  15183. C VBLS AND TYPE DIMENSIONED 60,301
  15184. C **************************************************
  15185. C *                                                *
  15186. C *         SUBROUTINE   SLEND(RETCD)              *
  15187. C *                                                *
  15188. C **************************************************
  15189. C
  15190. C
  15191. C
  15192. C SETS VALUE OF LEND, POINTER TO LAST NON-BLANK CHARACTER
  15193. C IN LINE(80)
  15194. C
  15195. C
  15196. C
  15197. C
  15198. C RETCD VALUE       MEANING
  15199. C
  15200. C    1            NORMAL RETURN
  15201. C    2            ALL BLANKS
  15202. C
  15203. C
  15204. C
  15205. C   SLEND IS CALLED BY CALC
  15206. C
  15207. C VARIABLE    USE
  15208. C
  15209. C  BLANK      ' '
  15210. C    I        INDEXES CHARACTERS IN LINE(80).
  15211. C  LEND       UPON EXIT, POINTS TO THE LAST NON-
  15212. C             BLANK IN LINE(80).
  15213. C  LINE(80)   HOLDS COMMAND LINE.
  15214. C  RETCD      RETURN CODE.  1=NORMAL, 2=ALL BLANKS
  15215. C
  15216. C
  15217. C
  15218. C    SUBROUTINE SLEND(RETCD)
  15219.     InTeGer*4 LEVEL,NONBLK,LEND
  15220.     InTeGer*4 VIEWSW,BASED,RETCD
  15221. C
  15222.     CHARACTER*1 ALPHA(27),COMMA,BLANK,RPAR,LPAR,EQ
  15223.     CHARACTER*1 LINE(80)
  15224. C
  15225.     COMMON LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  15226.     COMMON /CONS/ ALPHA,COMMA,BLANK,RPAR,LPAR,EQ
  15227. C
  15228. C
  15229. C
  15230. C
  15231.     RETCD=1
  15232.     DO 100 I=1,80
  15233.     IF(LINE(81-I).NE.BLANK)GO TO 200
  15234. 100    CONTINUE
  15235.     RETCD=2
  15236.     RETURN
  15237. 200    LEND=81-I
  15238.     RETURN
  15239.     END
  15240. c -h- sscmp.for    Tue Sep  2 10:58:55 1986    
  15241.     SUBROUTINE SSCMP(LINA,LINB,LENM,ICODE)
  15242.     DIMENSION LINA(1),LINB(1)
  15243.     CHARACTER*1 LINA,LINB
  15244.     ICODE=1
  15245.     DO 1 N=1,LENM
  15246. c    IF(ICHAR(LINA(N)).EQ.0.OR.ICHAR(LINB(N)).EQ.0)GOTO 2
  15247.     IF(ICHAR(LINA(N)).NE.ICHAR(LINB(N)))ICODE=0
  15248.     IF(ICODE.NE.1)GOTO 2
  15249. 1    CONTINUE
  15250. 2    CONTINUE
  15251.     RETURN
  15252.     END
  15253. c -h- sstr.for    Tue Sep  2 10:58:55 1986    
  15254.     SUBROUTINE SSTR(CMDLIN,LA,N,LE,FORM)
  15255.     CHARACTER*1 CMDLIN(132),FORM(128),NBF(8)
  15256.     InTeGer*4 LA,N,LE
  15257.     InTeGer*4 VLEN(9),TYPE(1,1)
  15258.     CHARACTER*1 AVBLS(20,27)
  15259.     REAL*8 XVBLS(1,1),XX,VP,TMP
  15260.     COMMON/V/TYPE,AVBLS,XVBLS,VLEN
  15261.     NI=N
  15262. C LOOK FOR V1,V2 VARIABLES; THEN GET NAME TO FILL IN.
  15263. C MUST PASS _@ CHARS TO GET VARIABLE
  15264.     LAA=LA+2
  15265.     LEE=LE
  15266.     CALL VARSCN(CMDLIN,LAA,LEE,LSTC,I1,I2,IVLD)
  15267.     IF(IVLD.LE.0)GOTO 990
  15268. C    XX=XVBLS(I1,I2)
  15269.     CALL XVBLGT(I1,I2,XX)
  15270.     VP=128.D0**7
  15271.     DO 1 NN=1,8
  15272.     TMP=DINT(XX/VP)
  15273.     NBF(NN)=CHAR(IDINT(TMP))
  15274.     XX=XX-(VP*TMP)
  15275.     VP=DINT(VP/128.D0)
  15276.     IF(VP.EQ.0.0D0)VP=1.0D0
  15277. 1    CONTINUE
  15278. C NOW NBF HAS 8 BYTES OF DATA CORRESPONDING TO DE-HASHED
  15279. C STRING. COPY TO FORM.
  15280.     NL=NI
  15281.     DO 2 NN=1,8
  15282.     FORM(NL)=NBF(NN)
  15283.     IF(ICHAR(NBF(NN)).GE.32)NL=NL+1
  15284. 2    CONTINUE
  15285. C NOW ADJUST CMDLIN AND SET RETURN UP FOR ORIGINAL LENGTH FIXUP
  15286. C NOTE NI IS WHERE N WAS ON START (INDEX OF _)
  15287. C AND LSTC IS NEXT CHAR AFTER VARIABLE ON CMDLIN
  15288. C AND NL IS NEXT CHAR IN FORM. ASSUME THAT FORM IS NOW SHORTER
  15289. C AND MOVE CMDLIN DOWN.
  15290.     N=NL-1
  15291.     LA=LSTC-1
  15292.     CMDLIN(LA)=FORM(N)
  15293. C HOPE ALL'S WELL NOW...
  15294.     RETURN
  15295. 990    FORM(N)=CMDLIN(N)
  15296.     RETURN
  15297.     END
  15298. c -h- strcmp.for    Tue Sep  2 10:58:55 1986    
  15299.     SUBROUTINE  STRCMP(NAME,LENGTH,RETCD)
  15300. C COPYRIGHT (C) 1983 GLENN EVERHART
  15301. C ALL RIGHTS RESERVED
  15302. C 60=MAX REAL ROWS
  15303. C 301=MAX REAL COLS
  15304. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  15305. C VBLS AND TYPE DIMENSIONED 60,301
  15306. C **************************************************
  15307. C *                                                *
  15308. C *   SUBROUTINE STRCMP(NAME,LENGTH,RETCD)         *
  15309. C *                                                *
  15310. C **************************************************
  15311. C
  15312. C
  15313. C  STRCMP LOOKS PAST BLANKS FOR THE NAME HELD BY NAME(1),...,NAME(LENGTH)
  15314. C  THE RETURN CODE RETCD INDICATES SUCCESS OR FAILURE:
  15315. C
  15316. C    1=MATCH
  15317. C    2=FAILURE
  15318. C
  15319. C  UPON EXIT, COMMON VARIABLE NONBLK
  15320. C         IF SUCCESSFUL, POINTS TO ONE BEYOND THE LAST CHARACTER SCANNED
  15321. C                 FOR MATCH
  15322. C         IF FAILURE, UNCHANGED
  15323. C
  15324. C
  15325. C
  15326. C  MODIFICATION CLASSES: M2
  15327. C
  15328. C
  15329. C
  15330. C  STRCMP CALLS GETNNB TO GET THE NEXT NON-BLANK FROM LINE(80)
  15331. C
  15332. C  STRCMP IS CALLED BY CMND
  15333. C
  15334. C
  15335. C
  15336. C
  15337. C VARIABLE       USE
  15338. C
  15339. C   I2        INDEXES NAME(LENGTH).
  15340. C   IS        HOLDS VALUE OF NONBLANK IN CASE AN ERROR OCCURS
  15341. C             AND IT IS NECESSARY TO RESTORE THE VALUE.
  15342. C   LENGTH    HOLDS THE LENGTH OF VECTOR NAME.
  15343. C   NONBLK    POINTER FOR COMMAND LINE HELD BY LINE(80).
  15344. C   RETCD     HOLDS RETURN CODE.  1=MATCH,  2=FAILURE
  15345. C
  15346. C
  15347. C
  15348. C
  15349. C    SUBROUTINE  STRCMP(NAME,LENGTH,RETCD)
  15350.     InTeGer*4 LENGTH
  15351.     InTeGer*4 LEVEL,NONBLK,LEND
  15352.     InTeGer*4  RETCD,VIEWSW,BASED
  15353. C
  15354.     CHARACTER*1  LINE(80),NAME(LENGTH)
  15355.     CHARACTER*1 ALPHA(27),COMMA,BLANK,RPAR,LPAR,EQ
  15356. C
  15357.     COMMON  /CONS/ALPHA,COMMA,BLANK,RPAR,LPAR,EQ
  15358.     COMMON  LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  15359. C
  15360. C UPON ENTRANCE, NONBLK POINTS TO THE FIRST CHARACTER
  15361. C IN NAME, COMPARE LOOKS PAST THIS TO THE NEXT CHARACTER
  15362. C SINCE CMND HAS ALREADY IDENTIFIED THAT FIRST CHARACTER
  15363. C IN THE COMMAND NAME (AFTER THE ASTERISK).
  15364.     IS=NONBLK
  15365.     CALL GETNNB(IPT,RETCD)
  15366.     GO TO (10,999),RETCD
  15367. C ON EXIT NONBLK POINTS TO LAST CHARACTER IN NAME
  15368. C
  15369. C
  15370. 10    DO 100 I2=1,LENGTH
  15371.     CALL GETNNB(IPT,RETCD)
  15372.     GO TO (20,999),RETCD
  15373.     STOP 20
  15374. 20    NONBLK=IPT
  15375.     IF(NAME(I2).NE.LINE(NONBLK))GOTO 999
  15376. 100    CONTINUE
  15377.     RETCD=1
  15378.     RETURN
  15379. C
  15380. C
  15381. C NO MATCH
  15382. 999    RETCD=2
  15383. C IF ERROR, RESTORE VALUE OF NONBLK
  15384.     NONBLK=IS
  15385.     RETURN
  15386.     END
  15387. c -h- svbl.for    Tue Sep  2 10:58:55 1986    
  15388.     SUBROUTINE SVBL(CMDLIN,LA,N,LE,FORM)
  15389.     Include Aparms.Inc
  15390.     InTeGer*4 VLEN(9),TYPE(1,1)
  15391.     CHARACTER*1 AVBLS(20,27)
  15392.     REAL*8 XVBLS(1,1),XX,XY,xmr,xmc
  15393.     COMMON/V/TYPE,AVBLS,XVBLS,VLEN
  15394.     CHARACTER*1 CMDLIN(132),FORM(128),NBF(8)
  15395.     CHARACTER*3 NBF3
  15396.     EQUIVALENCE(NBF3(1:1),NBF(5))
  15397.     InTeGer*4 LA,N,LE,I1,I2,J1,J2
  15398.     NI=N
  15399.     xmr=Mrows
  15400.     xmc=Mcols
  15401. C LOOK FOR V1,V2 VARIABLES; THEN GET NAME TO FILL IN.
  15402.     LAA=LA+2
  15403. C MUST PASS _# CHARS
  15404.     LEE=LE
  15405.     CALL VARSCN(CMDLIN,LAA,LEE,LSTC,I1,I2,IVLD)
  15406.     IF(IVLD.LE.0)GOTO 990
  15407.     LAA=LSTC+1
  15408. C ACCEPT ANY DELIMITER
  15409.     LEE=LE
  15410.     CALL VARSCN(CMDLIN,LAA,LEE,LSTC,J1,J2,IVLD)
  15411.     IF(IVLD.LE.0)GOTO 990
  15412. C    XX=XVBLS(I1,I2)
  15413.     CALL XVBLGT(I1,I2,XX)
  15414. C XX IS COL #
  15415. C    XY=XVBLS(J1,J2)-1.0
  15416.     CALL XVBLGT(J1,J2,XY)
  15417.     IF(XX.LE.(0.9D0).OR.XX.GT.XMR)GOTO 990
  15418.     IF(XY.LE.(0.9D0).OR.XY.GT.XMC)GOTO 990
  15419.     IC=XX
  15420.     CALL IN2AS(IC,NBF)
  15421.     IR=XY
  15422.     WRITE(NBF3(1:3),300)IR
  15423. C    ENCODE(3,300,NBF(5))IR
  15424. 300    FORMAT(I3)
  15425.     NL=NI
  15426. C FILL IN DECODED VARIABLE NAME, ZOTTING OUT EXTRA SPACES.
  15427.     DO 400 NN=1,7
  15428. C 47 IS ASCII VALUE FOR 0 CHARACTER
  15429. C ALPHAS ARE ALSO ALL HIGHER.
  15430.     IF(ICHAR(NBF(NN)).LE.40)GOTO 400
  15431.     FORM(NL)=NBF(NN)
  15432.     NL=NL+1
  15433. 400    CONTINUE
  15434. C NOW ADJUST CMDLIN AND SET RETURN UP FOR ORIGINAL LENGTH FIXUP
  15435. C NOTE NI IS WHERE N WAS ON START (INDEX OF _)
  15436. C AND LSTC IS NEXT CHAR AFTER 2ND VARIABLE ON CMDLIN
  15437. C AND NL IS NEXT CHAR IN FORM. ASSUME THAT FORM IS NOW SHORTER
  15438. C AND MOVE CMDLIN DOWN.
  15439.     N=NL
  15440.     LE=LE-LSTC+NL
  15441.     LA=LSTC
  15442. C    DO 401 M=N,LE
  15443. C    CMDLIN(M)=CMDLIN(M+LSTC-NL)
  15444. C401    CONTINUE
  15445. C HOPE ALL'S WELL NOW...
  15446.     RETURN
  15447. 990    CONTINUE
  15448.     FORM(N)=CMDLIN(N)
  15449.     RETURN
  15450.     END
  15451. c -h- swrt.for    Tue Sep  2 10:58:55 1986    
  15452. C
  15453. C SWRT - WRITE VARIABLE LENGTH STRING TO SCREEN WITHOUT
  15454. C RECORD TERMINATION.
  15455. C COPYRIGHT GLENN C EVERHART 1984
  15456. C ALL RIGHTS RESERVED
  15457. C *** Don't use for normal Amiga stuff, but have available in case
  15458. C *** it should be handy someplace...
  15459. C
  15460. C
  15461. ccc    SUBROUTINE SWRT(STRING,LENGTH)
  15462. ccc    CHARACTER*1 STRING(127)
  15463. ccc    INTEGER LENGTH
  15464. cccC DUMP OUT ALL WE CAN..
  15465. ccc    CHARACTER*9 SFM
  15466. ccc    CHARACTER*1 SFMX(9)
  15467. ccc    CHARACTER*3 SNM
  15468. ccc    EQUIVALENCE(SNM,SFMX(2))
  15469. ccc    EQUIVALENCE (SFMX(1),SFM)
  15470. cccC HERE ARE THE BUILT IN FORMATS. NOTE WE FILL IN THE
  15471. cccC REPEAT COUNT AT RUNTIME FOR THE TEXT TO BE WRITTEN.
  15472. cccC NOTE ALSO THAT THE 1ST CHAR IS A # SIGN TO SHOW UP PROBLEMS.
  15473. cccC FORMATS ARE (nnnA1,\)
  15474. cccC COMPRISING 13 CHARACTERS IN ALL.
  15475. ccc    DATA SFM/'(001A1,\)'/
  15476. cccC NOTE WE JUST FILL IN THE LENGTH AND WRITE TO SCREEN USING
  15477. cccC SFM AS A RUNTIME FORMAT.
  15478. cccC
  15479. ccc    IF(LENGTH.LE.0)RETURN
  15480. ccc    WRITE(SNM,1)LENGTH
  15481. ccc1    FORMAT(BZ,I3)
  15482. cccC WRITE ON UNIT 6 WHICH IS OUR SPECIALLY OPENED CONSOLE OUTPUT UNIT
  15483. cccC (VIA EXPLICIT OPEN IN MAIN PROGRAM)
  15484. ccc    WRITE(11,SFM)(STRING(II),II=1,LENGTH)
  15485. ccc    RETURN
  15486. ccc    END
  15487.     subroutine vget(buf,len)
  15488.     character*1 buf(132),cbf(132)
  15489.     integer*4 len,ii,i
  15490. C Read buf up to len from console
  15491.     do 2 i=1,128
  15492.     cbf(i)=char(0)
  15493. 2    continue
  15494.     call getttl(cbf)
  15495. c    call cmdmun(cbf)
  15496.     ii=min0(len,132)
  15497.     ii=max0(len,1)
  15498. C reads console into large buffer, returns n chars of it.
  15499.     do 1 i=1,ii
  15500.     buf(i)=cbf(i)
  15501. 1    Continue
  15502.     return
  15503.     end
  15504.     subroutine vgeti(iii)
  15505. C get integer from command line
  15506.     integer*4 iii
  15507.     character*20 buf
  15508.     call vget(buf,20)
  15509.     read(buf,1000,err=999)iii
  15510. 1000    format(i7)
  15511.     return
  15512. 999    Continue
  15513.     iii=0
  15514.     return
  15515.     end
  15516.     SUBROUTINE VWRT(STRING,LENGTH)
  15517. C ***<<<< RDD COMMON START >>>***
  15518.     InTeGer*4 RRWACT,RCLACT
  15519. C    COMMON/RCLACT/RRWACT,RCLACT
  15520.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  15521.      1  IDOL7,IDOL8
  15522. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  15523. C     1  IDOL7,IDOL8
  15524.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  15525. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  15526.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  15527. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  15528. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  15529. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  15530.     InTeGer*4 KLVL
  15531. C    COMMON/KLVL/KLVL
  15532.     InTeGer*4 IOLVL,IGOLD
  15533. C    COMMON/IOLVL/IOLVL
  15534. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  15535. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  15536.     Integer*4 IDSPTP,Idol9
  15537.     integer*4 k3dfg,kcdelt,krdelt,kpag
  15538.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  15539.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  15540.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  15541.      3  k3dfg,kcdelt,krdelt,kpag
  15542. C ***<<< RDD COMMON END >>>***
  15543. C VWRT is like SWRT but writes to lun 11 window instead.
  15544.     CHARACTER*1 STRING(127)
  15545.     INTEGER LENGTH
  15546. C DUMP OUT ALL WE CAN..
  15547.     IF(LENGTH.LE.0)RETURN
  15548. C WRITE ON UNIT 11 WHICH IS OUR SPECIALLY OPENED CONSOLE OUTPUT UNIT
  15549. C (VIA EXPLICIT OPEN IN MAIN PROGRAM)
  15550. c    REWIND 11
  15551. c    call uvt100(1,LLDSP,1)
  15552.     call swrt(string,length)
  15553. c    WRITE(11,777)(STRING(II),II=1,LENGTH)
  15554. c    REWIND 11
  15555. 777    format(1X,127A1)
  15556.     RETURN
  15557.     END
  15558.  
  15559. C *************** AnalyO.Ftn ##########################################
  15560. c -h- acini1.fnw    Fri Aug 22 12:55:08 1986    
  15561. C PORTACALC MAIN PROGRAM
  15562. C SPREAD SHEET DRIVER PROGRAM
  15563. C COPYRIGHT (C) 1983,1984 GLENN AND MARY EVERHART
  15564. C ALL RIGHTS RESERVED
  15565. C MAX SHEET DIMS ARE 60 BY 300 (301 SINCE ACCUMULATORS ARE A PSEUDO ROW)
  15566. C NOTE: THROUGHOUT, ROWS ARE ACTUALLY DOWN, COLUMNS ACROSS ON
  15567. C SCREEN.
  15568.     SUBROUTINE INITA1(KMAP,KWID,ICODE)
  15569. C
  15570.     Include AParms.inc
  15571.     InTeGer*4 PRL(6)
  15572.         CHARACTER*1 NOWRAP ( 2 )
  15573.     CHARACTER*1 FORM,FVLD,CMDLIN(132)
  15574.     INTEGER*4 VNLT
  15575.     INTEGER IFCW
  15576. c    EXTERNAL LCWRQQ
  15577.     DIMENSION FORM(128),FVLD(1,1)
  15578. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  15579. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  15580. C SO INITIALLY IGNORE.
  15581. C ***<<<< RDD COMMON START >>>***
  15582.     InTeGer*4 RRWACT,RCLACT
  15583. C    COMMON/RCLACT/RRWACT,RCLACT
  15584.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  15585.      1  IDOL7,IDOL8
  15586. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  15587. C     1  IDOL7,IDOL8
  15588.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  15589. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  15590.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  15591. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  15592. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  15593. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  15594.     InTeGer*4 KLVL
  15595. C    COMMON/KLVL/KLVL
  15596.     InTeGer*4 IOLVL,IGOLD
  15597. C    COMMON/IOLVL/IOLVL
  15598. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  15599. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  15600.     Integer*4 IDSPTP,Idol9
  15601.     integer*4 k3dfg,kcdelt,krdelt,kpag
  15602.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  15603.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  15604.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  15605.      3  k3dfg,kcdelt,krdelt,kpag
  15606. C ***<<< RDD COMMON END >>>***
  15607. CCC    InTeGer*4 RRWACT,RCLACT
  15608. CCC    COMMON/RCLACT/RRWACT,RCLACT
  15609. CCC    InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  15610. CCC     1  IDOL7,IDOL8
  15611. CCC    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  15612. CCC     1  IDOL7,IDOL8
  15613. CCC    InTeGer*4 LLCMD,LLDSP
  15614. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  15615. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  15616.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  15617.     COMMON/D2R/NRDSP,NCDSP
  15618. CCC    InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  15619. CCC    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  15620. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  15621. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  15622.     CHARACTER*1 FORM2(4)
  15623. C ***<<< XVXTCD COMMON START >>>***
  15624.     CHARACTER*1 OARRY(100)
  15625.     InTeGer*4 OSWIT,OCNTR
  15626. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  15627. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  15628.     InTeGer*4 IPS1,IPS2,MODFLG
  15629. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  15630.        InTeGer*4 XTCFG,IPSET,XTNCNT
  15631.        CHARACTER*1 XTNCMD(80)
  15632. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  15633. C VARY FLAG ITERATION COUNT
  15634.     INTEGER KALKIT
  15635. C    COMMON/VARYIT/KALKIT
  15636.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  15637.     InTeGer*4 RCMODE,IRCE1,IRCE2
  15638. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  15639. C     1  IRCE2
  15640. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  15641. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  15642. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  15643. C RCFGX ON.
  15644. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  15645. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  15646. C  AND VM INHIBITS. (SETS TO 1).
  15647.     INTEGER*4 FH
  15648. C FILE HANDLE FOR CONSOLE I/O (RAW)
  15649. C    COMMON/CONSFH/FH
  15650.     CHARACTER*1 ARGSTR(52,4)
  15651. C    COMMON/ARGSTR/ARGSTR
  15652.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  15653.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  15654.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  15655.      3  IRCE2,FH,ARGSTR
  15656. C ***<<< XVXTCD COMMON END >>>***
  15657. CCC    InTeGer*4 OSWIT,OCNTR
  15658. CCC    COMMON/OAR/OSWIT,OCNTR,OARRY
  15659. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  15660.     InTeGer*4 TYPE(1,1),VLEN(9)
  15661. CCC    InTeGer*4 KLVL
  15662. CCC    COMMON/KLVL/KLVL
  15663. CCC    InTeGer*4 IOLVL
  15664. CCC    COMMON/IOLVL/IOLVL
  15665. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  15666. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  15667.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1)
  15668.     REAL*8 XXV(1,1)
  15669.     EQUIVALENCE(XXV(1,1),VBLS(1,1,1))
  15670.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  15671. C DEFFMT IS THE DEFAULT FORMAT FOR NUMERICS. INITIALLY IT WILL BE F9.2
  15672.     CHARACTER*1 DVFMT(12),DEFFMT(10)
  15673.     CHARACTER*12 CDVFMT
  15674.     EQUIVALENCE(DVFMT(2),DEFFMT(1))
  15675.     EQUIVALENCE(CDVFMT(1:1),DVFMT(1))
  15676.     COMMON/DEFVBX/DVFMT
  15677.     CHARACTER*1 NMSH(80)
  15678.     CHARACTER*80 NMSH80
  15679.     EQUIVALENCE(NMSH80(1:1),NMSH(1))
  15680.     COMMON/NMSH/NMSH
  15681. CCC    InTeGer*4 IPS1,IPS2,MODFLG
  15682. CCC    COMMON/ICPOS/IPS1,IPS2,MODFLG
  15683. CCC       InTeGer*4 XTCFG,IPSET,XTNCNT
  15684. CCC       CHARACTER*1 XTNCMD(80)
  15685. CCC       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  15686. C VARY FLAG ITERATION COUNT
  15687. CCC    INTEGER KALKIT
  15688. CCC    COMMON/VARYIT/KALKIT
  15689. CCC    InTeGer*4 FORMFG,RCFGX,PZAP
  15690. CCC    InTeGer*4 RCONE,RCMODE,IRCE1,IRCE2
  15691. CCC    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,
  15692. CCC     1  IRCE1,IRCE2
  15693. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  15694. C RCFGX FLAGS WHETHER TO DO AUTO RECALC
  15695. C DISPLAY ARRAY WILL KEEP A COPY OF VARIABLES DISPLAYED
  15696.     InTeGer*4 CWIDS(20)
  15697. C CWIDS IS WIDTHS IN CHARACTERS OF COLUMNS ON DISPLAY.
  15698.     INTEGER*4 I4TMP
  15699. C ***<<< NULETC COMMON START >>>***
  15700.     InTeGer*4 ICREF,IRREF
  15701. C    COMMON/MIRROR/ICREF,IRREF
  15702.     InTeGer*4 MODPUB,LIMODE
  15703. C    COMMON/MODPUB/MODPUB,LIMODE
  15704.     InTeGer*4 KLKC,KLKR
  15705.     REAL*8 AACP,AACQ
  15706. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  15707.     InTeGer*4 NCEL,NXINI
  15708. C    COMMON/NCEL/NCEL,NXINI
  15709.     CHARACTER*1 NAMARY(20,MRows)
  15710. C    COMMON/NMNMNM/NAMARY
  15711.     InTeGer*4 NULAST,LFVD
  15712. C    COMMON/NULXXX/NULAST,LFVD
  15713.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  15714.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  15715. C ***<<< NULETC COMMON END >>>***
  15716. CCC    InTeGer*4 ICREF,IRREF
  15717. CCC    COMMON/MIRROR/ICREF,IRREF
  15718. C SETS NUMBER OF COLS TO ADD ON ROW OVERFLOW, ROWS TO ADD ON COL OVERFLOW
  15719. C FOR CELL ALIASING.
  15720.     REAL*8 DVS(20,75)
  15721.     COMMON /FVLDC/FVLD
  15722. C FOLLOWING SUPPORT VVARY OVERLAY:
  15723.     REAL*8 QQAC(26),QDERIV(8),QDEL(8),OLDVV,OLDX,OLDA
  15724.     LOGICAL*4 LEXIST
  15725.     InTeGer*4 QCAC,QCENT(8),ACV(8)
  15726.     COMMON/VRYDAT/QQAC,QDERIV,QDEL,QCAC,QCENT,OLDVV,OLDX,OLDA,ACV
  15727.     COMMON/DSPCMN/DVS,CWIDS
  15728.     CHARACTER*1 CHR
  15729.     character*20 fwt
  15730.     EQUIVALENCE(FWT(1:1),CHR)
  15731. C DISABLE FLOATING EXCEPTIONS
  15732. C    CALL LCWRQQ(IFCW)
  15733. C (MOVED LCWRQQ CALL TO MAIN)
  15734.     IDOL7=1
  15735. C ENABLE SCROLLING INITIALLY
  15736. C ZERO "SAVED DISPLAY VALUES" FIRST...
  15737.     DO 35 N=1,75
  15738.     DO 35 NN=1,20
  15739. 35    DVS(NN,N)=0.
  15740.     MODFLG=1
  15741. C INITIALLY IN NON ANSI MODE. STILL USE ANSI DRIVER FOR INPUT CONTROLS.
  15742. C NOW SET UP OTHER COMMON INFO (USED TO BE A BLOCK DATA...NOW CHANGED.)
  15743. C SETUP INITIAL DISPLAY LIMITS ACTUALLY USED.
  15744.     RRWACT=1
  15745.     K3DFG=0
  15746.     KCDELT=0
  15747.     KRDELT=0
  15748.     RCLACT=1
  15749.     IOLVL=11
  15750. c Set rather small sheet to allow for use on non-interlace screen
  15751. c initially
  15752.     DRWV=7
  15753.     DCLV=17
  15754.     LLCMD=20
  15755.     LLDSP=21
  15756.     If(Idsptp.ne.1)goto 4866
  15757.     DRWV=7
  15758.     DCLV=42
  15759.     LLCMD=45
  15760.     LLDSP=46
  15761. c Interlace dimensions for main window display
  15762. 4866    Continue
  15763.     ICREF=10
  15764.     IRREF=50
  15765. C SET INCREMENTS TO 1/6 OF TOTAL FOR STARTERS.
  15766.     KLVL=1
  15767.     KALKIT=0
  15768.     IRCE1=0
  15769.     IRCE2=0
  15770.     RCMODE=2
  15771.     ICODE=0
  15772.     idol3=0
  15773.     idol4=0
  15774.     idol5=20000
  15775.     idol6=20000
  15776.     Idol8=1
  15777.     RCFGX=0
  15778.     FORMFG=0
  15779. C      CALL GETADR ( PRL, NOWRAP )
  15780.       PRL ( 2 ) = 2
  15781. c    OPEN(6,FILE='CON:',STATUS='NEW',FORM='FORMATTED')
  15782.     If(Idsptp.eq.1)goto 4867
  15783. c Non interlace (640 x 200) screen
  15784. c    OPEN(11,FILE='CON:20/169/550/30/Analy Command Inputs',
  15785. c     1  ACTION='BOTH',ACCESS='SEQUENTIAL',FORM='FORMATTED')
  15786.     Goto 4868
  15787. 4867    Continue
  15788. c Interlace
  15789. c    OPEN(11,FILE='CON:20/369/550/30/Analy Command Inputs',
  15790. c     1  ACTION='BOTH',ACCESS='SEQUENTIAL',FORM='FORMATTED')
  15791. 4868    Continue
  15792. c    OPEN(18,FILE='CON:20/210/450/30/Analy Cmd Prompts',
  15793. c     1  ACTION='BOTH',ACCESS='SEQUENTIAL',FORM='FORMATTED')
  15794. C LOOK FOR 'ACINIT.PRM' INITIALIZER FILE. IF ONE FOUND, READ IT.
  15795. C IF NOT, ASK AT CONSOLE FOR SINGLE/DBL PRECISION AND INITIAL VIDEO MODE
  15796.     IVV=11
  15797. C SET UP AS THOUGH WE HAD AN @ACINIT.PRM AT STARTUP AND
  15798. C ALLOW IT TO GO THRU NORMALLY...
  15799.     INQUIRE(FILE='ACINIT.PRM',EXIST=LEXIST)
  15800.     IF(.NOT.LEXIST)GOTO 6003
  15801.     OPEN(3,FILE='ACINIT.PRM',STATUS='OLD',FORM='FORMATTED')
  15802. C    CALL RASSIG(3,'ACINIT.PRM')
  15803.     IVV=3
  15804.     IOLVL=3
  15805.     GOTO 6403
  15806. 6003    CONTINUE
  15807. C    OPEN(5,FILE='CON:',STATUS='OLD',FORM='FORMATTED')
  15808. C OPEN EITHER CONSOLE OR INIT FILE AT FIRST...
  15809. 6403    CONTINUE
  15810. 6005    FORMAT(80A1)
  15811. C For AMIGA always use "BIOS MODE" so we can have special windowing
  15812. C code in place of the Fortran I/O. Fortran console I/O will be done
  15813. C using LUN 11 in a CON: window, but most normal spreadsheet
  15814. C operations will take place in a special window over which we will have
  15815. C finer grained control...
  15816. C
  15817.     CALL SWSET(1)
  15818.     MODFLG=1
  15819. 6008    CONTINUE
  15820. C SETS UP FOR USING ROM BIOS DIRECTLY FOR EVERYTHING...
  15821. C COULD THEN USE E.G. NEWKEY TO DO KEYBOARD CMDS.
  15822.     GOTO 6002
  15823. 6006    CONTINUE
  15824. C ERROR ON INPUT HERE... JUST FORGET IT.
  15825.     CLOSE(3)
  15826.     IOLVL=11
  15827. C MAKE SURE LUN 5 HAS A CONSOLE FILE OPEN.
  15828. c    CLOSE(11)
  15829. c    OPEN(11,FILE='CON:0/50/200/60/Analy Command',
  15830. c     1  STATUS='OLD',FORM='FORMATTED')
  15831. 6002    CALL UVT100(18,0,0)
  15832. C PERFORM SYSTEM DEPENDENT INITIALIZATION for terminal. (none here really)
  15833. c may later read + write auxkpd.txt to set up escape seqs.
  15834.     CALL TTYINI
  15835. C
  15836. C SET UP THE SCREEN (ERASE, ETC.)
  15837. c erase screen first
  15838.     CALL UVT100(1,5,10)
  15839.     CALL UVT100(11,2,0)
  15840. c position cursor to r5c10
  15841.     CALL UVT100(1,5,10)
  15842. C ZERO THE VARIABLES TO START OFF WITH.
  15843.     DO 2070 KK=1,20
  15844.     DO 2070 KKK=1,27
  15845. 2070    AVBLS(KK,KKK)=0
  15846. C SET UP WORK ARRAY BITMAP
  15847.     CALL WRKFIL(1,FORM,2)
  15848. c set reverse video title
  15849.     CALL UVT100(13,7,0)
  15850.     CALL SWRT('AnalytiCalc-68K',15)
  15851.     CALL UVT100(1,6,12)
  15852.     CALL SWRT('V25-03A',7)
  15853.     CALL UVT100(13,0,0)
  15854.     CALL UVT100(1,8,3)
  15855.     CALL SWRT(' ...The Analyst`s Tool',22)
  15856.     CALL UVT100(1,9,5)
  15857. C original name was VisiKluge, then ViziKluge, then PortaCalc, then 
  15858. C AnalyCalc, then AnalytiCalc.
  15859.     CALL SWRT('Copyright (C) 1982-1990 Glenn & Mary Everhart',45)
  15860.     CALL UVT100(1,10,1)
  15861. C ALLOW SPACE FOR ASKING FOR MONEY LATER VIA PATCH IF DESIRED.
  15862.     CALL SWRT('If you use this program please send $10.00 donation',
  15863.      1  51)
  15864.     CALL UVT100(1,11,1)
  15865.     CALL SWRT('to Glenn Everhart, 25 Sleigh Ride, Glen Mills PA. ',
  15866.      1  50)
  15867.     CALL UVT100(1,12,1)
  15868.     CALL SWRT('19342. May be copied for others',
  15869.      1  31)
  15870. C NOW GET ON WITH USEFUL WORK.
  15871.       PRL ( 2 ) = 1
  15872.       PRL ( 3 ) = 0
  15873. c set ansi mode...
  15874.       CALL UVT100 ( 18 ,0,0)
  15875.     Call uvt100(1,13,1)
  15876.     KWID=10
  15877.     KMAP=1
  15878.     RETURN
  15879.     END
  15880. c -h- acini2.for    Fri Aug 22 12:55:25 1986    
  15881. C PORTACALC MAIN PROGRAM
  15882. C SPREAD SHEET DRIVER PROGRAM
  15883. C COPYRIGHT (C) 1983,1984 GLENN AND MARY EVERHART
  15884. C ALL RIGHTS RESERVED
  15885. C NOTE: THROUGHOUT, ROWS ARE ACTUALLY DOWN, COLUMNS ACROSS ON
  15886. C SCREEN. ROW 0 IN DISPLAY IS THE 27 ACCUMULATORS A-Z AND %, WITH
  15887. C % BEING THE LAST-COMPUTED VALUE FROM THE CALC PROGRAM, WHICH
  15888. C KNOWS HOW TO ACCESS THE DATA BUT IS JUST PASSED COMMAND STRINGS
  15889. C FROM THE DISK BASED FILE HERE.
  15890.     SUBROUTINE INITA2(KMAP,KWID,ICODE,IKONS)
  15891. C
  15892.     Include AParms.inc
  15893.     InTeGer*4 PRL(6)
  15894.         CHARACTER*1 NOWRAP ( 2 )
  15895.     CHARACTER*1 FORM,FVLD,CMDLIN(132)
  15896.     INTEGER*4 VNLT
  15897.     INTEGER IFCW
  15898. C    EXTERNAL LCWRQQ
  15899.     DIMENSION FORM(128),FVLD(1,1)
  15900. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  15901. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  15902. C SO INITIALLY IGNORE.
  15903. C
  15904. C ROUTINE IN2AS COMPUTES ASCII CHARACTER NAMES OF SUBSCRIPTS IN1,IN2
  15905. C SO DISPLAY CAN HAVE THEM. IT MUST BE THE INVERSE OF VARSCN.
  15906. C ***<<<< RDD COMMON START >>>***
  15907.     InTeGer*4 RRWACT,RCLACT
  15908. C    COMMON/RCLACT/RRWACT,RCLACT
  15909.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  15910.      1  IDOL7,IDOL8
  15911. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  15912. C     1  IDOL7,IDOL8
  15913.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  15914. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  15915.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  15916. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  15917. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  15918. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  15919.     InTeGer*4 KLVL
  15920. C    COMMON/KLVL/KLVL
  15921.     InTeGer*4 IOLVL,IGOLD
  15922. C    COMMON/IOLVL/IOLVL
  15923. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  15924. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  15925.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  15926.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  15927.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  15928.      3  k3dfg,kcdelt,krdelt,kpag
  15929. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  15930. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  15931. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  15932. C ***<<< RDD COMMON END >>>***
  15933. CCC    InTeGer*4 RRWACT,RCLACT
  15934. CCC    COMMON/RCLACT/RRWACT,RCLACT
  15935. CCC    InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  15936. CCC     1  IDOL7,IDOL8
  15937. CCC    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  15938. CCC     1  IDOL7,IDOL8
  15939. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  15940. CCC    InTeGer*4 LLCMD,LLDSP
  15941. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  15942.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  15943.     COMMON/D2R/NRDSP,NCDSP
  15944. C ***<<< NULETC COMMON START >>>***
  15945.     InTeGer*4 ICREF,IRREF
  15946. C    COMMON/MIRROR/ICREF,IRREF
  15947.     InTeGer*4 MODPUB,LIMODE
  15948. C    COMMON/MODPUB/MODPUB,LIMODE
  15949.     InTeGer*4 KLKC,KLKR
  15950.     REAL*8 AACP,AACQ
  15951. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  15952.     InTeGer*4 NCEL,NXINI
  15953. C    COMMON/NCEL/NCEL,NXINI
  15954.     CHARACTER*1 NAMARY(20,MRows)
  15955. C    COMMON/NMNMNM/NAMARY
  15956.     InTeGer*4 NULAST,LFVD
  15957. C    COMMON/NULXXX/NULAST,LFVD
  15958.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  15959.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  15960. C ***<<< NULETC COMMON END >>>***
  15961. CCC    InTeGer*4 ICREF,IRREF
  15962. CCC    COMMON/MIRROR/ICREF,IRREF
  15963. CCC    InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  15964. CCC    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  15965. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  15966. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  15967.     CHARACTER*1 FORM2(4)
  15968. C ***<<< XVXTCD COMMON START >>>***
  15969.     CHARACTER*1 OARRY(100)
  15970.     InTeGer*4 OSWIT,OCNTR
  15971. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  15972. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  15973.     InTeGer*4 IPS1,IPS2,MODFLG
  15974. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  15975.        InTeGer*4 XTCFG,IPSET,XTNCNT
  15976.        CHARACTER*1 XTNCMD(80)
  15977. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  15978. C VARY FLAG ITERATION COUNT
  15979.     INTEGER KALKIT
  15980. C    COMMON/VARYIT/KALKIT
  15981.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  15982.     InTeGer*4 RCMODE,IRCE1,IRCE2
  15983. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  15984. C     1  IRCE2
  15985. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  15986. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  15987. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  15988. C RCFGX ON.
  15989. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  15990. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  15991. C  AND VM INHIBITS. (SETS TO 1).
  15992.     INTEGER*4 FH
  15993. C FILE HANDLE FOR CONSOLE I/O (RAW)
  15994. C    COMMON/CONSFH/FH
  15995.     CHARACTER*1 ARGSTR(52,4)
  15996. C    COMMON/ARGSTR/ARGSTR
  15997.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  15998.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  15999.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  16000.      3  IRCE2,FH,ARGSTR
  16001. C ***<<< XVXTCD COMMON END >>>***
  16002. CCC    InTeGer*4 OSWIT,OCNTR
  16003. CCC    COMMON/OAR/OSWIT,OCNTR,OARRY
  16004. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  16005.     InTeGer*4 TYPE(1,1),VLEN(9)
  16006. CCC    InTeGer*4 KLVL
  16007. CCC    COMMON/KLVL/KLVL
  16008. CCC    InTeGer*4 IOLVL
  16009. CCC    COMMON/IOLVL/IOLVL
  16010. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  16011. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  16012.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1)
  16013.     REAL*8 XXV(1,1)
  16014.     EQUIVALENCE(XXV(1,1),VBLS(1,1,1))
  16015.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  16016. C DEFFMT IS THE DEFAULT FORMAT FOR NUMERICS. INITIALLY IT WILL BE F9.2
  16017.     CHARACTER*1 DVFMT(12),DEFFMT(10)
  16018.     EQUIVALENCE(DVFMT(2),DEFFMT(1))
  16019.     CHARACTER*12 CDVFMT
  16020.     EQUIVALENCE(CDVFMT(1:1),DVFMT(1))
  16021.     COMMON/DEFVBX/DVFMT
  16022.     CHARACTER*1 NMSH(80)
  16023.     CHARACTER*80 NMSH80
  16024.     EQUIVALENCE(NMSH80(1:1),NMSH(1))
  16025.     COMMON/NMSH/NMSH
  16026. CCC    InTeGer*4 IPS1,IPS2,MODFLG
  16027. CCC    COMMON/ICPOS/IPS1,IPS2,MODFLG
  16028. CCC       InTeGer*4 XTCFG,IPSET,XTNCNT
  16029. CCC       CHARACTER*1 XTNCMD(80)
  16030. CCC       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  16031. C VARY FLAG ITERATION COUNT
  16032. CCC    INTEGER KALKIT
  16033. CCC    COMMON/VARYIT/KALKIT
  16034. CCC    InTeGer*4 FORMFG,RCFGX,PZAP
  16035. CCC    COMMON/FFGG/FORMFG,RCFGX,PZAP
  16036. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  16037. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  16038. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  16039. C RCFGX ON.
  16040. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  16041. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  16042. C  AND VM INHIBITS. (SETS TO 1).
  16043. C
  16044. C DISPLAY ARRAY WILL KEEP A COPY OF VARIABLES DISPLAYED AND FORMATS
  16045. C USED LOCALLY WHICH DISPLAY ROUTINE CAN USE TO SEE WHAT ACTUALLY
  16046. C NEEDS TO BE REFRESHED ON SCREEN. DRWV AND DCLV ARE COLS, ROWS OF
  16047. C DISPLAY ACTUALLY USED FOR SCREEN.
  16048.     InTeGer*4 CWIDS(20)
  16049. C CWIDS IS WIDTHS IN CHARACTERS OF COLUMNS ON DISPLAY. NOTE THAT BECAUSE
  16050. C OF PECULIAR INVERSION WHICH I AM TOO LAZY TO CORRECT IT IS DIMENSIONED
  16051. C AS 20 NOT 75.
  16052.     INTEGER*4 I4TMP
  16053.     REAL*8 DVS(20,75)
  16054.     COMMON /FVLDC/FVLD
  16055. C FOLLOWING SUPPORT VVARY OVERLAY:
  16056.     REAL*8 QQAC(26),QDERIV(8),QDEL(8),OLDVV,OLDX,OLDA
  16057.     InTeGer*4 QCAC,QCENT(8),ACV(8)
  16058.     COMMON/VRYDAT/QQAC,QDERIV,QDEL,QCAC,QCENT,OLDVV,OLDX,OLDA,ACV
  16059. C BITMAP
  16060. C    CHARACTER*1 IBITMP
  16061. C    DIMENSION IBITMP(2258)
  16062. C    COMMON/INITD/IBITMP
  16063. C    CHARACTER*1 DFMTS(10,20,75)
  16064. C 10 CHARACTERS PER ENTRY.
  16065.     COMMON/DSPCMN/DVS,CWIDS
  16066.     character*35 fwt
  16067. C ***<<< KLSTO COMMON START >>>***
  16068.     InTeGer*4 DLFG
  16069. C    COMMON/DLFG/DLFG
  16070.     InTeGer*4 KDRW,KDCL
  16071. C    COMMON/DOT/KDRW,KDCL
  16072.     InTeGer*4 DTRENA
  16073. C    COMMON/DTRCMN/DTRENA
  16074.     REAL*8 EP,PV,FV
  16075.     DIMENSION EP(20)
  16076.     INTEGER*4 KIRR
  16077. C    COMMON/ERNPER/EP,PV,FV,KIRR
  16078.     InTeGer*4 LASTOP
  16079. C    COMMON/ERROR/LASTOP
  16080.     CHARACTER*1 FMTDAT(9,76)
  16081. C    COMMON/FMTBFR/FMTDAT
  16082.     CHARACTER*1 EDNAM(16)
  16083. C    COMMON/EDNAM/EDNAM
  16084.     InTeGer*4 MFID(2),MFMOD(2)
  16085. C    COMMON/FRM/MFID,MFMOD
  16086.     InTeGer*4 JMVFG,JMVOLD
  16087. C    COMMON/FUBAR/JMVFG,JMVOLD
  16088.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  16089.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  16090. C ***<<< KLSTO COMMON END >>>***
  16091. CCC    CHARACTER*1 EDNAM(16)
  16092. CCC    COMMON/EDNAM/EDNAM
  16093.     CHARACTER*1 EDNINI(4)
  16094.     DATA EDNINI/'E','D','I','T'/
  16095. C    DATA NOWRAP / "24,0 /
  16096. C
  16097.     DO 2900 III=1,16
  16098. 2900    EDNAM(III)=' '
  16099.     DO 2901 III=1,4
  16100. 2901    EDNAM(III)=EDNINI(III)
  16101.     IF(IKONS.EQ.0)GOTO 3000
  16102. 3002    CONTINUE
  16103.     CALL UVT100(1,1,1)
  16104.     CALL VWRT('Alter Widths or Mapping Y/N:',28)
  16105.     ILL=IOLVL
  16106. C    IF(ILL.EQ.5)ILL=0
  16107.     if(ill.ne.11)READ(ILL,3006,END=5600,ERR=5600)FORM
  16108.     if(ill.eq.11)call vget(form,4)
  16109.     IF(FORM(1).NE.'Y'.AND.FORM(1).NE.'y')GOTO 3000
  16110.     CALL VWRT('Enter NEW Global Column Width 1-120:',36)
  16111. C ALTER MAPPING DESIRED
  16112.     if(ill.ne.11)READ(ILL,3004,END=5600,ERR=5600)KWID
  16113.     if(ill.eq.11)call vgeti(kwid)
  16114. 3004    FORMAT(I3)
  16115.     IF(KWID.LT.1.OR.KWID.GT.120)KWID=10
  16116.     CALL VWRT('Enter length of display in lines (nominally 24):',48)
  16117.     if(ill.ne.11)READ(ILL,3004,END=5600,ERR=5600)III
  16118.     if(ill.eq.11)call vgeti(iii)
  16119.     IF(III.LE.4.OR.III.GT.999)III=24
  16120. C RESET DISPLAY SIZE IN S COMMAND QUESTIONS AS NEEDED.
  16121.     LLDSP=III
  16122.     LLCMD=III-1
  16123.     CALL VWRT('Change annotate editor from "EDIT" [Y/N]:',41)
  16124.     if(ill.ne.11)READ(ILL,3006,END=5600,ERR=5600)FORM
  16125.     if(ill.eq.11)call vget(form,4)
  16126.     IF(FORM(1).NE.'Y'.AND.FORM(1).NE.'y')GOTO 3031
  16127.     CALL VWRT('Give desired edit command:',26)
  16128.     if(ill.ne.11)READ(ILL,3006,END=5600,ERR=5600)EDNAM
  16129.     if(ill.eq.11)call vget(ednam,16)
  16130.     EDNAM(16)=' '
  16131. C ENSURE THERE'S A SPACE AT END OF EDITOR NAME
  16132. 3031    CONTINUE
  16133.     CALL VWRT('Modify Extended Area Remap Y/N: ',31)
  16134.     if(ill.ne.11)READ(ILL,3006,END=5600,ERR=5600)FORM
  16135.     if(ill.eq.11)call vget(form,4)
  16136.     IF(FORM(1).NE.'Y'.AND.FORM(1).NE.'y')GOTO 3502
  16137.     CALL VWRT('# cols to move over on row overflow:',36)
  16138.     if(ill.ne.11)READ(ILL,3004,END=5600,ERR=5600)ICREF
  16139.     if(ill.eq.11)call vgeti(icref)
  16140.     IF(ICREF.GT.MCols)ICREF=10
  16141.     IF(ICREF.LT.0)ICREF=10
  16142.     CALL VWRT('# rows to move down on col overflow:',34)
  16143.     if(ill.ne.11)READ(ILL,3004,END=5600,ERR=5600)IRREF
  16144.     if(ill.eq.11)call vgeti(irref)
  16145.     IF(IRREF.GT.(MRows-1))IRREF=50
  16146.     IF(IRREF.LT.0)IRREF=50
  16147. C FORCE THE RESULTS TO MAKE SENSE. 0 TO 60 ON COLS, 0-300 ON ROWS.
  16148. C IF USER BOTHERS TO READ MANUALS THIS WILL BE EXPLAINED.
  16149. 3502    CONTINUE
  16150.     CALL VWRT('Reset Display to Upper Left of Sheet Y/N:',40)
  16151.     if(ill.ne.11)READ(ILL,3006,END=5600,ERR=5600)FORM
  16152.     if(ill.eq.11)call vget(form,4)
  16153.     IF(FORM(1).NE.'Y'.AND.FORM(1).NE.'y')KMAP=0
  16154. 3006    FORMAT(80A1,50A1)
  16155. 3000    CONTINUE
  16156.     RETURN
  16157. 5600    CONTINUE
  16158.     IOLVL=11
  16159.     CLOSE(3)
  16160. c    Rewind 11
  16161. c    CLOSE(11)
  16162. c    OPEN(11,FILE='CON:0/0/100/100/Analy Command',
  16163. c     1  STATUS='OLD',FORM='FORMATTED')
  16164.     RETURN
  16165.     END
  16166. c -h- acini3.for    Fri Aug 22 12:55:39 1986    
  16167. C PORTACALC MAIN PROGRAM
  16168. C SPREAD SHEET DRIVER PROGRAM
  16169. C COPYRIGHT (C) 1983,1984 GLENN AND MARY EVERHART
  16170. C ALL RIGHTS RESERVED
  16171. C NOTE: THROUGHOUT, ROWS ARE ACTUALLY DOWN, COLUMNS ACROSS ON
  16172. C SCREEN. ROW 0 IN DISPLAY IS THE 27 ACCUMULATORS A-Z AND %, WITH
  16173. C % BEING THE LAST-COMPUTED VALUE FROM THE CALC PROGRAM, WHICH
  16174. C KNOWS HOW TO ACCESS THE DATA BUT IS JUST PASSED COMMAND STRINGS
  16175. C FROM THE DISK BASED FILE HERE.
  16176.     SUBROUTINE INITB(KMAP,KWID,ICODE)
  16177. C
  16178.     Include AParms.inc
  16179.     InTeGer*4 PRL(6)
  16180.         CHARACTER*1 NOWRAP ( 2 )
  16181.     CHARACTER*1 FORM,FVLD,CMDLIN(132)
  16182.     INTEGER*4 VNLT
  16183.     INTEGER IFCW
  16184. C    EXTERNAL LCWRQQ
  16185.     DIMENSION FORM(128),FVLD(1,1)
  16186. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  16187. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  16188. C SO INITIALLY IGNORE.
  16189. C
  16190. C ROUTINE IN2AS COMPUTES ASCII CHARACTER NAMES OF SUBSCRIPTS IN1,IN2
  16191. C SO DISPLAY CAN HAVE THEM. IT MUST BE THE INVERSE OF VARSCN.
  16192. C ***<<<< RDD COMMON START >>>***
  16193.     InTeGer*4 RRWACT,RCLACT
  16194. C    COMMON/RCLACT/RRWACT,RCLACT
  16195.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  16196.      1  IDOL7,IDOL8
  16197. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  16198. C     1  IDOL7,IDOL8
  16199.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  16200. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  16201.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  16202. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  16203. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  16204. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  16205.     InTeGer*4 KLVL
  16206. C    COMMON/KLVL/KLVL
  16207.     InTeGer*4 IOLVL,IGOLD
  16208. C    COMMON/IOLVL/IOLVL
  16209. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  16210. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  16211.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  16212.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  16213.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  16214.      3  k3dfg,kcdelt,krdelt,kpag
  16215. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  16216. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  16217. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  16218. C ***<<< RDD COMMON END >>>***
  16219. CCC    InTeGer*4 RRWACT,RCLACT
  16220. CCC    COMMON/RCLACT/RRWACT,RCLACT
  16221. CCC    InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  16222. CCC     1  IDOL7,IDOL8
  16223. CCC    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  16224. CCC     1  IDOL7,IDOL8
  16225. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  16226. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  16227.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  16228.     COMMON/D2R/NRDSP,NCDSP
  16229. CCC    InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  16230. CCC    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  16231. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  16232. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  16233.     CHARACTER*1 FORM2(4)
  16234. C ***<<< XVXTCD COMMON START >>>***
  16235.     CHARACTER*1 OARRY(100)
  16236.     InTeGer*4 OSWIT,OCNTR
  16237. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  16238. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  16239.     InTeGer*4 IPS1,IPS2,MODFLG
  16240. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  16241.        InTeGer*4 XTCFG,IPSET,XTNCNT
  16242.        CHARACTER*1 XTNCMD(80)
  16243. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  16244. C VARY FLAG ITERATION COUNT
  16245.     INTEGER KALKIT
  16246. C    COMMON/VARYIT/KALKIT
  16247.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  16248.     InTeGer*4 RCMODE,IRCE1,IRCE2
  16249. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  16250. C     1  IRCE2
  16251. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  16252. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  16253. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  16254. C RCFGX ON.
  16255. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  16256. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  16257. C  AND VM INHIBITS. (SETS TO 1).
  16258.     INTEGER*4 FH
  16259. C FILE HANDLE FOR CONSOLE I/O (RAW)
  16260. C    COMMON/CONSFH/FH
  16261.     CHARACTER*1 ARGSTR(52,4)
  16262. C    COMMON/ARGSTR/ARGSTR
  16263.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  16264.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  16265.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  16266.      3  IRCE2,FH,ARGSTR
  16267. C ***<<< XVXTCD COMMON END >>>***
  16268. CCC    InTeGer*4 OSWIT,OCNTR
  16269.  
  16270. CCC    COMMON/OAR/OSWIT,OCNTR,OARRY
  16271. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  16272.     InTeGer*4 TYPE(1,1),VLEN(9)
  16273. CCC    InTeGer*4 KLVL
  16274. CCC    COMMON/KLVL/KLVL
  16275. CCC    InTeGer*4 IOLVL
  16276. CCC    COMMON/IOLVL/IOLVL
  16277. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  16278. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  16279.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1)
  16280.     REAL*8 XXV(1,1)
  16281.     EQUIVALENCE(XXV(1,1),VBLS(1,1,1))
  16282.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  16283. C DEFFMT IS THE DEFAULT FORMAT FOR NUMERICS. INITIALLY IT WILL BE F9.2
  16284.     CHARACTER*1 DVFMT(12),DEFFMT(10)
  16285.     CHARACTER*12 CDVFMT
  16286.     EQUIVALENCE(DEFFMT(1),DVFMT(2))
  16287.     EQUIVALENCE(CDVFMT(1:1),DVFMT(1))
  16288.     COMMON/DEFVBX/DVFMT
  16289.     CHARACTER*1 NMSH(80)
  16290.     CHARACTER*80 NMSH80
  16291.     EQUIVALENCE(NMSH80(1:1),FORM(1))
  16292.     COMMON/NMSH/NMSH
  16293. CCC    InTeGer*4 IPS1,IPS2,MODFLG
  16294. CCC    COMMON/ICPOS/IPS1,IPS2,MODFLG
  16295. CCC       InTeGer*4 XTCFG,IPSET,XTNCNT
  16296. CCC       CHARACTER*1 XTNCMD(80)
  16297. CCC       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  16298. C VARY FLAG ITERATION COUNT
  16299. CCC    INTEGER KALKIT
  16300. CCC    COMMON/VARYIT/KALKIT
  16301. CCC    InTeGer*4 FORMFG,RCFGX,PZAP
  16302. CCC    COMMON/FFGG/FORMFG,RCFGX,PZAP
  16303. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  16304. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  16305. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  16306. C RCFGX ON.
  16307. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  16308. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  16309. C  AND VM INHIBITS. (SETS TO 1).
  16310. C
  16311. C DISPLAY ARRAY WILL KEEP A COPY OF VARIABLES DISPLAYED AND FORMATS
  16312. C USED LOCALLY WHICH DISPLAY ROUTINE CAN USE TO SEE WHAT ACTUALLY
  16313. C NEEDS TO BE REFRESHED ON SCREEN. DRWV AND DCLV ARE COLS, ROWS OF
  16314. C DISPLAY ACTUALLY USED FOR SCREEN.
  16315.     InTeGer*4 CWIDS(20)
  16316. C CWIDS IS WIDTHS IN CHARACTERS OF COLUMNS ON DISPLAY. NOTE THAT BECAUSE
  16317. C OF PECULIAR INVERSION WHICH I AM TOO LAZY TO CORRECT IT IS DIMENSIONED
  16318. C AS 20 NOT 75.
  16319.     INTEGER*4 I4TMP
  16320.     REAL*8 DVS(20,75)
  16321.     COMMON /FVLDC/FVLD
  16322. C FOLLOWING SUPPORT VVARY OVERLAY:
  16323.     REAL*8 QQAC(26),QDERIV(8),QDEL(8),OLDVV,OLDX,OLDA
  16324.     InTeGer*4 QCAC,QCENT(8),ACV(8)
  16325.     COMMON/VRYDAT/QQAC,QDERIV,QDEL,QCAC,QCENT,OLDVV,OLDX,OLDA,ACV
  16326. C BITMAP
  16327. C    CHARACTER*1 IBITMP
  16328. C    DIMENSION IBITMP(2258)
  16329. C    COMMON/INITD/IBITMP
  16330. C    CHARACTER*1 DFMTS(10,20,75)
  16331. C 10 CHARACTERS PER ENTRY.
  16332.     COMMON/DSPCMN/DVS,CWIDS
  16333.     character*35 fwt
  16334. C    DATA NOWRAP / "24,0 /
  16335. C
  16336.     idol5=20000
  16337.     idol6=20000
  16338. C INITIALLY SET JRCL TO 301 = NO. OF ROWS TO BE IN WORK FILE
  16339.     JRCL=MRows
  16340.     PZAP=0
  16341.     XTCFG=0
  16342.     IPSET=0
  16343. C ZERO BITMAP
  16344. C    DO 36 N1=1,2258
  16345. C36    IBITMP(N1)=0
  16346. c    LINIZZ=0
  16347.     CALL UVT100(1,14,1)
  16348.     CALL VWRT('Enter NEW floating format default Y/N:',38)
  16349.     ILL=IOLVL
  16350. C    IF(ILL.EQ.5)ILL=0
  16351.     if(ill.ne.11)READ(ILL,3006,END=5600,ERR=5600)FORM
  16352.     if(ill.eq.11)call vget(form,4)
  16353.     IF(FORM(1).NE.'Y'.AND.FORM(1).NE.'y')GOTO 3589
  16354. C ENTER NEW DEFAULT.
  16355. 6888    CALL UVT100(1,14,1)
  16356.     CALL UVT100(12,2,0)
  16357. C LINE NOW ERASED... GET NEW FORMAT
  16358.     CALL VWRT('Enter new format. Suggest F10.2>',32)
  16359.     if(ill.ne.11)READ(ILL,3006,END=5600,ERR=5600)FORM
  16360.     if(ill.eq.11)call vget(form,16)
  16361. C NOW HAVE HIS DESIRED FORMAT. COPY INTO THE DEFAULT ARRAY.
  16362. C DEFFMT IS THAT.
  16363.     DO 3591 N1=1,10
  16364.     KKK=ICHAR(FORM(N1))
  16365.     KKK=MAX0(32,KKK)
  16366. C ASSUME NMSH COMPLETELY INIT'D
  16367. 3591    DEFFMT(N1)=Char(KKK)
  16368. c    dvfmt(1)='('
  16369. c    dvfmt(12)=')'
  16370. C CHECK ITS LEGALITY BY TRYING TO USE IT ONCE.
  16371.     XX=3.14159
  16372.     WRITE(NMSH80(1:80),DVFMT,ERR=6888)XX
  16373. C    ENCODE(78,DVFMT,NMSH,ERR=6888)XX
  16374. C IF IT FAILS, PROGRAM WILL CRASH AND FILE WON'T GET CLOBBERED.
  16375. 3589    CONTINUE
  16376.     CALL UVT100(1,15,1)
  16377.     CALL VWRT('Title for Spreadsheet:',22)
  16378.     ILL=IOLVL
  16379. C    IF(ILL.EQ.5)ILL=0
  16380.     if(ill.ne.11)READ(ILL,3006,END=5600,ERR=5600)FORM
  16381.     if(ill.eq.11)call vget(form,120)
  16382. 3006    FORMAT(80A1,50A1)
  16383.     IF(ICHAR(FORM(1)).LE.32.AND.ICHAR(FORM(2)).LE.32) GOTO 3008
  16384. C COPY TITLE UNLESS IT'S OLD
  16385.     DO 3007 KKK=1,80
  16386. 3007    NMSH(KKK)=FORM(KKK)
  16387. C THAT WAY JUST C.R. LEAVES IN OLD TITLE.
  16388. 3008    CONTINUE
  16389. C ****** IF S OPTION GIVEN THEN ICODE=-2
  16390. C THEREFORE, DON'T ASK DISK SIZE ETC, BUT ALLOW RESET OF TITLE
  16391. C AND DEFAULT FORMATS.
  16392.     IF(ICODE.EQ.-2) GOTO 7831
  16393. C ******
  16394.     CALL UVT100(1,16,1)
  16395.     CALL VWRT('Give Max Rows to be used:',25)
  16396.     if(ill.ne.11)READ(ILL,7202,END=5600,ERR=5600)KR
  16397.     if(ill.eq.11)call vgeti(kr)
  16398.     IF(KR.LE.0)KR=MRows
  16399.     CALL UVT100(1,17,1)
  16400.     CALL VWRT('Give Max Cols to be used:',25)
  16401.     if(ill.ne.11)READ(ILL,7202,END=5600,ERR=5600)KC
  16402.     if(ill.eq.11)call vgeti(kc)
  16403.     IF(KC.LE.0)KC=MCols
  16404. C    KKK=(KR-1)*60+KC
  16405. C ALLOW REPLIES IN ANY RANGE AND REFLECT BACK TO PRIME RANGE
  16406. C NOTE WE WANT A CELL ADDRESS HERE FOR THE END CELL...
  16407.     CALL REFLEC(KR,KC,KKK)
  16408.     XKKKK=KR*KC
  16409.     XKDF=XKKKK/64.
  16410.     XKDN=XKKKK/100.
  16411. C COMPUTED ABOVE THE MIN # OF K FOR DISK FILES
  16412.     CALL UVT100(1,18,1)
  16413.     write(fwt(1:12),2058)xkdn
  16414. 2058    format(F9.0)
  16415.     CALL SWRT('Min=',4)
  16416.     call swrt(fwt(1:12),9)
  16417.     write(fwt,2058)xkdf
  16418.     call swrt(' K Value file ',14)
  16419.     CALL SWRT(fwt(1:12),9)
  16420.     CALL SWRT(' K Formula file',15)
  16421. c    WRITE(0,2058)XKDN,XKDF
  16422. c2058    FORMAT(' Mins=',F9.0' K Value file, ',F9.0,' K Formula file',\)
  16423. C KKK IS MAX INDEX TO BE USED HERE.
  16424.     CALL UVT100(1,21,1)
  16425.     CALL VWRT('Give Value File size, K:',24)
  16426.     if(ill.ne.11)READ(ILL,7202,END=5600,ERR=5600)IPGMAX
  16427.     if(ill.eq.11)call vgeti(ipgmax)
  16428. 7202    FORMAT(I6)
  16429.     IPGMOD=KKK
  16430.     IF(IPGMAX.LT.0)IPGMOD=0
  16431.     IPGMAX=IABS(IPGMAX)
  16432.     IF(IPGMAX.GT.2512)IPGMAX=1
  16433.     CALL UVT100(1,22,1)
  16434.     CALL VWRT('Give Formula File size, K:',26)
  16435.     if(ill.ne.11)READ(ILL,7202,END=5600,ERR=5600)LPGMXF
  16436.     if(ill.eq.11)call vgeti(lpgmxf)
  16437.     LPGMOD=KKK
  16438.     IF(LPGMXF.LT.0)LPGMOD=0
  16439.     LPGMXF=IABS(LPGMXF)
  16440. C IF NUMBERS ARE ENTERED NEGATIVE, SET MODE TO "SLOW, FILE-SPACE
  16441. C CONSERVING" PACKING, SCATTERING PAGES ACROSS FILE.
  16442.     IF(LPGMXF.GT.4096)LPGMXF=(IPGMAX*3)/2
  16443. C NULL TERMINATE ALL FORMAT STRINGS.
  16444. C SET MAX WIDTH FOR PRINT TO DIMENSION OF THE BUFFER. NOTE THIS IS THE
  16445. C USUAL HARDWARE MAXIMUM SO WE DON'T WORRY TOO MUCH ABOUT IT. NOTE
  16446. C BILL TABOR'S PROGRAM TO PRINT PASTE-ABLE VERSIONS OF THE SHEET FROM
  16447. C SAVE FILES EXISTS, SO WE NEEDN'T WORRY TOO MUCH EITHER ABOUT USING
  16448. C DISPLAY FOR DOUBLE DUTY.
  16449.     MXL=132
  16450. C INITIALIZE WORK STORAGE FOR FORMULAS AND VARIABLES
  16451.     CALL WSSET
  16452. 7831    CONTINUE
  16453. C SET DEFAULT WIDTHS OF COLUMNS TO 10. MAY BE ALTERED BELOW FOR DIFFERENT
  16454. C DEFAULT IF DESIRED.
  16455.     DO 16 N1=1,20
  16456.     CWIDS(N1)=KWID
  16457. 16    CONTINUE
  16458. C
  16459. C NOW SET UP NRDSP, NCDSP
  16460.     IF(KMAP.EQ.0)GOTO 3009
  16461. C SET UP MAPPING NOW FOR INITIALLY UPPER LEFT CORNER OF PHYS SHEET IN DISPLAY SHT.
  16462.     DO 5 N1=1,20
  16463.     DO 5 N2=1,75
  16464. C INITIALLY WE DISPLAY THE UPPER LEFT PART OF THE SYSTEM.
  16465. C ESTABLISH ASSOCIATION INITIALLY THEREFORE OF DISPLAY TO UPPER
  16466. C LEFT OF PHYSICAL SHEET.
  16467.     NRDSP(N1,N2)=N1
  16468.     NCDSP(N1,N2)=N2+1
  16469.     DVS(N1,N2)=.00000031
  16470. 5    CONTINUE
  16471. C FOR S OPTION USE SECRET -4 CODE TO RESET SHEET. STILL NEEDS WORK
  16472. C IN PORTACALC PC.
  16473.     IF(ICODE.EQ.-4)CALL WRKFIL(1,FORM,2)
  16474. 3009    IF(ICODE.EQ.-4)GOTO 1
  16475. C43    CALL UVT100(1,21,1)
  16476.     KZPPD=0
  16477.     CMDLIN(1)=Char(0)
  16478.     IOLDFL=0
  16479. C3017    FORMAT(Q,80A1,80A1)
  16480.     MXL=1
  16481.     CMDLIN(MXL+1)=Char(0)
  16482. 3572    FORMAT(I6)
  16483.     CALL UVT100(13,0,0)
  16484. C  SET UP RANDOM FILE AS NEEDED FOR SHEET
  16485. C EACH RECORD HAS:
  16486. C CHARS 1-110    FORMULAS
  16487. C CHARS 120-128    DISPLAY FORMAT (INITIALLY F9.2)
  16488. C CHAR 119    VALID FLAG (ALLOWS HANDLING READS.)
  16489. C    values: -3, -2: Numeric-only text (or special chars)
  16490. C         -1    : Alphanumeric text
  16491. C          0    : Uninitialized
  16492. C          1    : Alphanumeric formula
  16493. C         +2    : Number or pure numeric formula with value calculated
  16494. C         +3    : Number or pure numeric formula, value not yet computed
  16495. C CHAR 118    MAGIC NUMBER 15 (CHECKS ALL WELL)
  16496. C READ A RECORD, IF ERROR, CREATE EMPTY FILE.
  16497. C    IF(IOLDFL.EQ.0)GOTO 1
  16498. CC IF IOLDFL NONZERO IT MEANS USER CLAIMS THERE EXISTS A FILE. IF 0 IT'S NEW.
  16499. CC HERE IT'S OLD SO LET'S BE SURE IT REALLY IS OK.
  16500. 1    CONTINUE
  16501. C HIT EOF OR ERROR. MUST BE A NEW FILE. THEREFORE ZERO IT TO OUR NEEDS.
  16502. C AT THIS POINT WE ARE CREATING A NEW FILE AND NEED TO ZERO IT.
  16503. C
  16504.     DO 3 N=1,128
  16505.     FORM(N)=Char(0)
  16506. 3    CONTINUE
  16507.     DO 3592 N=1,9
  16508. C SET UP DEFAULT FORMAT
  16509. 3592    FORM(119+N)=DEFFMT(N)
  16510.     FORM(118)=CHAR(15)
  16511.     FORM(1)='0'
  16512.     FORM(2)='.'
  16513. C CREATE NULL FILE INITIALLY BY RESETTING ALL.
  16514.     JRRCL=MCols*JRCL
  16515.     KZPPD=1
  16516. C
  16517. 2    CONTINUE
  16518. C COMMON POINT WITH FILE PREPARED.
  16519.     PCOL=2
  16520.     PROW=1
  16521.     DCOL=1
  16522.     DROW=1
  16523.     RETURN
  16524. 5600    CONTINUE
  16525. C ERROR ON READ FROM IOLVL HANDLED HERE.
  16526. C    REWIND 5
  16527.     Rewind 11
  16528. c    CLOSE(11)
  16529. c    OPEN(11,FILE='CON:0/150/500/49/Analy Command',
  16530. c     1  STATUS='OLD',FORM='FORMATTED')
  16531.     CLOSE(3)
  16532.     IOLVL=11
  16533.     RETURN
  16534.     END
  16535. c -h- block.for    Fri Aug 22 12:58:14 1986    
  16536.     SUBROUTINE BLOCK
  16537. C    BLOCK DATA
  16538. C COPYRIGHT (C) 1983 GLENN EVERHART
  16539. C ALL RIGHTS RESERVED
  16540. C 18060 = 60*301
  16541. C 18033=18060-27
  16542. C 60=MAX REAL ROWS
  16543. C 301=MAX REAL COLS
  16544. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  16545. C VBLS AND TYPE DIMENSIONED 60,301
  16546.     Include AParms.Inc
  16547. C   ++++++++++++++++++++++++++++++++++++++++++++++++++
  16548. C   +                                                +
  16549. C   +            CALC    VERSION  X01-06             +
  16550. C   +                                                +
  16551. C   ++++++++++++++++++++++++++++++++++++++++++++++++++
  16552. C
  16553. C
  16554. C *******************************************************
  16555. C *                                                     *
  16556. C *            BLOCK  DATA  MODULE                      *
  16557. C *                                                     *
  16558. C *******************************************************
  16559. C
  16560. C
  16561. C COMMON AREAS ARE INITIALIZED BY THIS MODULE.
  16562. C FAKEUP FOR MICROSOFT WHICH HAS NO BLOCK DATA.
  16563. C DO IT ALL VIA LOOPS...
  16564. C
  16565. C
  16566. C MODIFIED 18-MAY-1981 P.B. SET % TO VERSION 6
  16567. C
  16568. C
  16569. C
  16570. C   VARIABLE      USE
  16571. C
  16572. C  ALPHA(27)    HOLDS LEGAL VARIABLE NAMES: ALPHABETIC CHARACTERS
  16573. C               OR THE CHARACTER %.
  16574. C  BASED     HOLDS DEFAULT BASE.
  16575. C  BLANK        ' '
  16576. C  COMMA        ','
  16577. C  DIGITS(16,3) HOLDS DECIMAL, OCTAL, AND HEXADECIMAL DIGITS. THE
  16578. C               SECOND SUBSCRIPT IS
  16579. C                     1 FOR DECIMAL
  16580. C                     2 FOR OCTAL
  16581. C                     3 FOR HEXADECIMAL
  16582. C  DTBL1(9,9,8) CONTROLS THE DECISION PROCESS WHEN EVALUATING A
  16583. C               BINARY OPERATION. SEE BELOW FOR DETAILS.
  16584. C  EQ           '='
  16585. C  ITCNTV(6)    INDEXED BY LEVEL. 0 INDICATES THAT NO ITERATION ON THE
  16586. C               INDIRECT COMMAND FILE IS TO TAKE PLACE. IF POSITIVE, IT
  16587. C               HOLDS THE INDEX INTO VBLS AND REPRESENTS THE VARIABLE
  16588. C               USED TO CONTROL ITERATION.
  16589. C  LINE(80)     COMMAND INPUT LINE
  16590. C  LPAR         '('
  16591. C  RPAR         ')'
  16592. C  ST1LIM       HOLDS THE SIZE OF STACK 1 (ALWAYS CONSTANT)
  16593. C  ST2LIM       HOLDS THE SIZE OF STACK 2 (ALWAYS CONSTANT)
  16594. C  ST1PT        POINTS TO THE TOP OF STACK 1 (CHANGES AS STACK IS USED)
  16595. C  ST2PT        POINTS TO THE TOP OF STACK 2 (CHANGES AS STACK IS USED)
  16596. C  ST1TYP(40)       DATA TYPE FOR EACH ELEMENT IN STACK 1
  16597. C  ST2TYP(40)       DATA TYPE FOR EACH ELEMENT IN STACK 2
  16598. C  STACK1(20,40)   UTILITY STACKS USED WHEN EVALUATING EXPRESSIONS. THE FIRST
  16599. C  STACK2(20,40)   SUBSCRIPT CONTROLS INDEXING ACROSS THE BYTES OF A SINGLE
  16600. C                   VARIABLE. THE SECOND SUBSCRIPT CONTROLS STACK ELEMENTS.
  16601. C  TYPE(27)         HOLDS THE DATA TYPES FOR EACH OF THE 27 VARIABLES. SEE
  16602. C                   CODES.FTN FOR THE POSSIBLE VALUES.
  16603. C  VIEWSW           VIEW SWITCH
  16604. C                    0 = OUTPUT ERROR MESSAGES
  16605. C                    1 = OUTPUT ERROR MESSAGES AND FILE COMMAND LINES
  16606. C                    2 = OUTPUT ERROR MESSAGES AND VALUE OF EXPRESSIONS
  16607. C                        EVALUATED.
  16608. C                    3 = OUTPUT EVERYTHING
  16609. C  VLEN(9)      INDEXED BY DATA TYPE. GIVES THE NUMBER OF BYTES USED
  16610. C               BY THAT DATA TYPE.
  16611. C  AVBLS(20,27)      HOLDS THE VALUES OF THE 27 LEGAL VARIABLES.(ACCUMULATORS)
  16612. C  VBLS(8,60,301)    HOLDS VALUES OF ALL VARIABLES
  16613. C
  16614. C
  16615. C
  16616. C    CONSTANTS ARE STORED IN VBLS ACCORDING TO THEIR TYPE:
  16617. C
  16618. C
  16619. C
  16620. C <----------- MULTIPLE PRECISION (M10, M8, M16) ------------------------->
  16621. C !                        <------------- DECIMAL AND REAL --------------->
  16622. C !                        !                      <-- INTEGER HEX OCTAL -->
  16623. C !                                               !             ---> ASCII <---
  16624. C !                        !                      !                        !
  16625. C
  16626. C -------------     -------------------------------------------------------
  16627. C !     !     !     !     !     !     !     !     !     !     !     !     !
  16628. C ! 20  !  19 ! ... !  9  !  8  !  7  !  6  !  5  !  4  !  3  !  2  !  1  !
  16629. C !     !     !     !     !     !     !     !     !     !     !     !     !
  16630. C -------------     -------------------------------------------------------
  16631. C
  16632. C
  16633. C NOTE: BYTE 20 HOLDS THE SIGN FOR MULTIPLE PRECISION NUMBERS.
  16634. C       0 = POSITIVE, 1 = NEGATIVE
  16635. C
  16636. C
  16637. C
  16638. C
  16639. C
  16640. C    BLOCK DATA
  16641.     InTeGer*4 LEVEL,NONBLK,LEND
  16642.     InTeGer*4 LASTOP
  16643.     InTeGer*4 ST1TYP(40),ST2TYP(40)
  16644.     InTeGer*4 TYPE(1,1)
  16645.     InTeGer*4 VIEWSW,BASED,VLEN(9),BVLEN(9)
  16646.     InTeGer*4 ST1LIM,ST2LIM,ST1PT,ST2PT
  16647.     InTeGer*4 ITCNTV(6)
  16648. C
  16649.     CHARACTER*1 ALPHA(27),COMMA,BLANK,RPAR,LPAR,EQ,LINE(80)
  16650.     CHARACTER*1 BOMMA,BBLANK,BRPAR,BLPAR,BEQ
  16651.     CHARACTER*1 STACK1(8,40),STACK2(8,40)
  16652.     CHARACTER*1 AVBLS(20,27),BLPHA(27)
  16653.     CHARACTER*1 VBLS(8,1,1)
  16654. C ***<<< XVXTCD COMMON START >>>***
  16655.     CHARACTER*1 OARRY(100)
  16656.     InTeGer*4 OSWIT,OCNTR
  16657. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  16658. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  16659.     InTeGer*4 IC1POS,IC2POS,MODFLG
  16660. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  16661.        InTeGer*4 XTCFG,IPSET,XTNCNT
  16662.        CHARACTER*1 XTNCMD(80)
  16663. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  16664. C VARY FLAG ITERATION COUNT
  16665.     INTEGER KALKIT
  16666. C    COMMON/VARYIT/KALKIT
  16667.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  16668.     InTeGer*4 RCMODE,IRCE1,IRCE2
  16669. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  16670. C     1  IRCE2
  16671. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  16672. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  16673. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  16674. C RCFGX ON.
  16675. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  16676. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  16677. C  AND VM INHIBITS. (SETS TO 1).
  16678.     INTEGER*4 FH
  16679. C FILE HANDLE FOR CONSOLE I/O (RAW)
  16680. C    COMMON/CONSFH/FH
  16681.     CHARACTER*1 ARGSTR(52,4)
  16682. C    COMMON/ARGSTR/ARGSTR
  16683.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IC1POS,IC2POS,MODFLG,
  16684.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  16685.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  16686.      3  IRCE2,FH,ARGSTR
  16687. C ***<<< XVXTCD COMMON END >>>***
  16688. CCC    InTeGer*4 IC1POS,IC2POS
  16689. CCC    COMMON/ICPOS/IC1POS,IC2POS
  16690.     CHARACTER*1 DTBL1(9,9,8)
  16691. CC BIG WASTEFUL TABLE TO INIT OPERATION TYPE DATA. TRY TO REUSE SPACE.
  16692. C MOVED TABLE TO WRKFIL WHERE IT IS OVERLAIN BY A BUFFER DURING OPERATION
  16693. C AND JUST INITIALIZES DTBL1 AT STARTUP. THIS SHOULD ESSENTIALLY REMOVE DATA
  16694. C SPACE PENALTY FOR THIS HUGE ARRAY. NOTE IT'D BE SMALLER IF THERE WEREN'T
  16695. C SO MANY SUPPORTED DATA TYPES IN CALC.
  16696. C    InTeGer*4 BTBL(9,9,8)
  16697. C    InTeGer*4 BTBL1(9,9)
  16698. C    InTeGer*4 BTBL2(9,9),BTBL3(9,9),BTBL4(9,9),BTBL5(9,9)
  16699. C    InTeGer*4 BTBL6(9,9),BTBL7(9,9),BTBL8(9,9)
  16700. C    EQUIVALENCE(BTBL(1,1,1),BTBL1(1,1)),(BTBL(1,1,2),BTBL2(1,1))
  16701. C    EQUIVALENCE(BTBL(1,1,3),BTBL3(1,1)),(BTBL(1,1,4),BTBL4(1,1))
  16702. C    EQUIVALENCE(BTBL(1,1,5),BTBL5(1,1)),(BTBL(1,1,6),BTBL6(1,1))
  16703. C    EQUIVALENCE(BTBL(1,1,7),BTBL7(1,1)),(BTBL(1,1,8),BTBL8(1,1))
  16704.     CHARACTER*1 DIGITS(16,3),BIGITS(16,3)
  16705. C
  16706. C OARRY WILL BE USED TO HOLD OUTPUT VARIABLE IF OSWIT IS NONZERO
  16707. CCC    InTeGer*4 OSWIT
  16708. C OCNTR MAY HOLD BYTES VALID IN OARRY (UP TO 100, NO MORE...)
  16709. CCC    InTeGer*4 OCNTR
  16710. CCC    CHARACTER*1 OARRY(100)
  16711. C
  16712. C ILINE IS PROGRAMMABLE LINE INPUT (I.E., NOT FROM CONSOLE)
  16713.     CHARACTER*1 ILINE(106)
  16714.     InTeGer*4 ILNFG
  16715.     InTeGer*4 ILNCT
  16716.     COMMON /ILN/ILNFG,ILNCT,ILINE
  16717. C ILINE IS PRESENT IF ILNFG <> 0 AND ILNCT HAS # BYTES IN IT.
  16718. CCC    COMMON /OAR/OSWIT,OCNTR,OARRY
  16719.     COMMON LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  16720.     COMMON /CONS/ALPHA,COMMA,BLANK,RPAR,LPAR,EQ
  16721.     COMMON /STACK/ STACK1,STACK2,ST1PT,ST2PT,ST1TYP,ST2TYP,
  16722.      ;         ST1LIM,ST2LIM
  16723.     COMMON /V/ TYPE,AVBLS,VBLS,VLEN
  16724.     COMMON /DECIDE/ DTBL1
  16725.     COMMON /DIGV/ DIGITS
  16726. C ***<<< KLSTO COMMON START >>>***
  16727.     InTeGer*4 DLFG
  16728. C    COMMON/DLFG/DLFG
  16729.     InTeGer*4 KDRW,KDCL
  16730. C    COMMON/DOT/KDRW,KDCL
  16731.     InTeGer*4 DTRENA
  16732. C    COMMON/DTRCMN/DTRENA
  16733.     REAL*8 EP,PV,FV
  16734.     DIMENSION EP(20)
  16735.     INTEGER*4 KIRR
  16736. C    COMMON/ERNPER/EP,PV,FV,KIRR
  16737. c    InTeGer*4 LASTOP
  16738. C    COMMON/ERROR/LASTOP
  16739.     CHARACTER*1 FMTDAT(9,76)
  16740. C    COMMON/FMTBFR/FMTDAT
  16741.     CHARACTER*1 EDNAM(16)
  16742. C    COMMON/EDNAM/EDNAM
  16743.     InTeGer*4 MFID(2),MFMOD(2)
  16744. C    COMMON/FRM/MFID,MFMOD
  16745.     InTeGer*4 JMVFG,JMVOLD
  16746. C    COMMON/FUBAR/JMVFG,JMVOLD
  16747.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  16748.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  16749. C ***<<< KLSTO COMMON END >>>***
  16750. CCC    COMMON /ERROR/ LASTOP
  16751.     COMMON/ITERA/ ITCNTV
  16752.     CHARACTER*1 DVFMT(12),BVFMT(12)
  16753.     COMMON/DEFVBX/DVFMT
  16754. C SUPPORT VVARY OVERLAY WITH INITIAL VARY DATA:
  16755.     REAL*8 QAC(26),QDERIV(8),QDEL(8),QOLDVV
  16756.     InTeGer*4 QCAC,QCENT(8),ACV(8)
  16757.     COMMON/VRYDAT/QAC,QDERIV,QDEL,QCAC,QCENT,QOLDVV,ACV
  16758. C INITIAL DEFAULT FORMAT FOR NUMERICS
  16759.     DATA BVFMT/'(','F','9','.','2',' ',
  16760.      1  ' ',' ',' ',' ',' ',')'/
  16761. C
  16762. C    DATA BIEWSW/2/
  16763. C    DATA ITCNTV/6*0/
  16764.     DATA BLPHA/'A','B','C','D','E','F','G','H','I','J','K','L','M',
  16765.      ;       'N','O','P','Q','R','S','T','U','V','W','X','Y','Z','%'/
  16766.     DATA BIGITS/'1','2','3','4','5','6','7','8','9',
  16767.      1  '0','0','0','0','0','0','0',
  16768.      ;       '1','2','3','4','5','6','7',
  16769.      1  '0','0','0','0','0','0','0','0','0',
  16770.      ;  '1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','0'/
  16771.     DATA BOMMA/','/,BBLANK/' '/,BRPAR/')'/,BLPAR/'('/,BEQ/'='/
  16772. C
  16773. C
  16774. C DEFAULT BASE IS 10
  16775. C    DATA BASED/10/
  16776. C
  16777. C
  16778. C STACKS ARE CURRENTLY SET AT 40 ELEMENTS DEEP
  16779. C    DATA ST1LIM/40/, ST2LIM/40/
  16780. C
  16781. C
  16782. C
  16783. C    DEFAULT TYPES
  16784. C    A,B,C,D,E,F,G,H  =  DECIMAL
  16785. C    I,J,K,L,M,N      =  INTEGER (BASE10)
  16786. C    O,P,Q,R,S,T,U,V,W,X,Y,Z  =  DECIMAL
  16787. C
  16788. C  % AS INTEGER TO HOLD CALC VERSION NUMBER
  16789. C
  16790. C    DATA TYPE/8*2,6*4,12*2,4,1*2/
  16791. c modify type array so ac's i-n are reals
  16792. C    DATA TYPE/8*2,6*2,12*2,2,1*2/
  16793. C
  16794. C
  16795. C GIVE VERSION # BY VALUE IN %
  16796. C
  16797. c don't bother with this; by the time user gets into calc,
  16798. c % already is clobbered most times, so no need for it.
  16799. c    DATA AVBLS(1,27)/6/
  16800. c    DATA AVBLS(2,27)/0/,AVBLS(3,27)/0/,AVBLS(4,27)/0/
  16801. C
  16802. C
  16803. C
  16804. C
  16805. C SPECIFY THE LENGTH USED BY EACH DATA TYPE
  16806.     DATA BVLEN/1,8,4,4,8,8,8,4,8/
  16807. C
  16808. C NOTE ALL LENGTHS 8 OR LESS SINCE MULTIPLE PRECISION THINGS SNIPPED OUT
  16809. C
  16810. C  DECISION TABLE FOR PERFORMING BINARY OPERATIONS
  16811. C
  16812. C  DTBL1(OPERAND2,OPERAND1,INDEX)
  16813. C
  16814. C  WHERE:                    OPERATOR:
  16815. C  INDEX=1    MODIFY CODE FOR OPERAND 1    */+-
  16816. C     2    MODIFY CODE FOR OPERAND 2    */+-
  16817. C     3    FUNCTION VALUE TYPE        */+-
  16818. C     4    OPERATOR CLASS            */+-
  16819. C
  16820. C     5    MODIFY CODE FOR OPERAND 1    **
  16821. C     6    MODIFY CODE FOR OPERAND 2    **
  16822. C     7    FUNCTION VALUE TYPE        **
  16823. C     8    OPERATOR CLASS            **
  16824. C
  16825. C
  16826. C  WHERE TYPE CODES (MODIFY CODES) ARE:
  16827. C    0    NO CHANGE
  16828. C    1    CONVERT TO ASCII
  16829. C    2    CONVERT TO DECIMAL
  16830. C    3    CONVERT TO HEXADECIMAL
  16831. C    4    CONVERT TO INTEGER
  16832. C    5    CONVERT TO M10
  16833. C    6    CONVERT TO M8
  16834. C    7    CONVERT TO M16
  16835. C    8    CONVERT TO OCTAL
  16836. C    9    CONVERT TO REAL
  16837. C
  16838. C  FOR */+- FUNCTION VALUE TYPES AND OPERATOR CLASS ARE PRESENTLY
  16839. C  IDENTICAL
  16840. C
  16841. C  FOR **  OPERATOR CLASSES FOLLOW:
  16842. C
  16843. C     CODE    OPERATOR CLASS
  16844. C    1    REAL**REAL
  16845. C    2    REAL**INTEGER
  16846. C    3    INTEGER**REAL
  16847. C    4    INTEGER**REAL
  16848. C    5    M8**INTEGER
  16849. C    6    M10**INTEGER
  16850. C    7    M16**INTEGER
  16851. C
  16852. C
  16853. C
  16854. C    DATA BTBL1 /4,2,3,4,5,6,7,8,9,
  16855. C     1  9*0,0,2,0,0,3*7,0,9,0,2,0,0,5,5,7,0,9,0,2,7,0,0,0,7,0,9,
  16856. C     2  0,2,7,5,5,0,7,0,9,0,2,6*0,9,0,2,3,0,5,6,7,0,9,0,2,7*0/
  16857. C    DATA BTBL2/
  16858. C     3  4,8*0,2,0,6*2,0,3,3*0,7,7,3*0,4,4*0,5,3*0,5,0,7,5,0,5,0,5,0,
  16859. C     4  6,0,7,5,3*0,6,0,7,2,4*7,0,7,0,8,8*0,9,0,6*9,0/
  16860. C    DATA BTBL3/4,2,3,4,5,6,7,8,9,
  16861. C     5  9*2,3,2,3,3,3*7,3,9,4,2,3,4,5,5,7,4,9,5,2,7,3*5,7,5,9,
  16862. C     6  6,2,7,5,5,6,7,6,9,7,2,6*7,9,8,2,3,4,5,6,7,8,9,9,2,7*9/
  16863. C    DATA BTBL4/
  16864. C     7  4,2,3,4,5,6,7,8,9,9*2,3,2,3,3,3*7,3,9,4,2,3,4,5,5,7,4,9,
  16865. C     8  5,2,7,5,5,5,7,5,9,6,2,7,5,5,6,7,6,9,7,2,6*7,9,8,2,3,4,5,6,7,8,9,
  16866. C     9  9,2,7*9/
  16867. C    DATA BTBL5/4,2,3,6*4,9*0,9*0,9*0,0,9,6*0,9,0,9,6*0,9,0,9,6*0,9,
  16868. C     1  9*0,9*0/
  16869. C    DATA BTBL6/4,3*0,3*9,4,0,4,3*0,3*9,0,0,4,3*0,3*9,2*0,4,3*0,3*9,
  16870. C     2  2*0,4,3*0,3*4,2*0,4,3*0,3*4,2*0,4,3*0,3*4,2*0,4,3*0,3*9,2*0,
  16871. C     3  4,3*0,3*9,2*0/
  16872. C        DATA BTBL7/4,2,3,6*4,9*2,9*3,9*4,5,9,6*5,9,6,9,6,6,5,6,7,6,9,
  16873. C     4  7,9,6*7,9,9*8,9*9/
  16874. C    DATA BTBL8/4,1,4,4,3,3,3,4,3,2,1,2,2,3*1,2,1,4,3,4,4,3*3,
  16875. C     5  4,3,4,3,4,4,3*3,4,3,6,1,6*6,1,5,1,6*5,1,7,1,6*7,1,4,3,4,4,3*3,
  16876. C     6  4,3,2,1,2,2,3*1,2,1/
  16877. C
  16878. C HERE COPY LOCAL DATA INTO THE COMMONS.
  16879. C SINCE MOST ARRAYS AND THINGS ARE SMALL, WE JUST DO IT WITH REGULAR FORTRAN.
  16880. C THE BTBL ARRAY IS HANDLED IN WRKFIL WHERE THERE'S A BIG ENOUGH ARRAY FOR
  16881. C SCRATCH SPACE TO HOLD THE INITIAL DATA; WRKFIL IS CALLED BY WSSET WITH
  16882. C "SECRET CODE" TO INIT DTBL1 FROM THE ARRAY AND DOES SO ONCE ONLY.
  16883.     VIEWSW=0
  16884.     LEVEL=1
  16885.     LASTOP=0
  16886.     BASED=10
  16887.     COMMA=BOMMA
  16888.     BLANK=BBLANK
  16889.     RPAR=BRPAR
  16890.     LPAR=BLPAR
  16891.     EQ=BEQ
  16892.     DO 1 N=1,6
  16893.     ITCNTV(N)=0
  16894. 1    CONTINUE
  16895.     DO 2 N=1,27
  16896.     DO 12 NN=1,20
  16897. 12    AVBLS(NN,N)=Char(0)
  16898. 2    ALPHA(N)=BLPHA(N)
  16899.     ST1LIM=40
  16900.     ST2LIM=40
  16901. C THIS IS DONE IN WRKFIL SINCE THERE'S A BIG LOCAL ARRAY THERE
  16902. C WE CAN KEEP EQUIVALENCED TO THIS ONE...
  16903. C    DO 3 N2=1,9
  16904. C    DO 3 N1=1,9
  16905. C    DTBL1(N1,N2,2)=BTBL2(N1,N2)
  16906. C    DTBL1(N1,N2,3)=BTBL3(N1,N2)
  16907. C    DTBL1(N1,N2,4)=BTBL4(N1,N2)
  16908. C    DTBL1(N1,N2,5)=BTBL5(N1,N2)
  16909. C    DTBL1(N1,N2,6)=BTBL6(N1,N2)
  16910. C    DTBL1(N1,N2,7)=BTBL7(N1,N2)
  16911. C    DTBL1(N1,N2,8)=BTBL8(N1,N2)
  16912. C3    DTBL1(N1,N2,1)=BTBL1(N1,N2)
  16913.     DO 4 N=1,9
  16914.     VLEN(N)=BVLEN(N)
  16915. 4    CONTINUE
  16916.     DO 5 N2=1,3
  16917.     DO 5 N1=1,16
  16918.     DIGITS(N1,N2)=BIGITS(N1,N2)
  16919. 5    CONTINUE
  16920. C SET UP DEFAULT DISPLAY FORMAT (INCLUDES "(" AND ")" CHARS WHICH
  16921. C ***MUST*** BE THERE FOR MAIN PGM TO WORK).
  16922.     DO 17 N=1,12
  16923.     DVFMT(N)=BVFMT(N)
  16924. 17    Continue
  16925.     DO 15 N=1,26
  16926.     QAC(N)=0.
  16927. 15    CONTINUE
  16928.     DO 18 N=1,8
  16929.     QDERIV(N)=1.
  16930.     ACV(N)=0
  16931.     QDEL(N)=0.
  16932.     QCENT(N)=0
  16933. 18    CONTINUE
  16934.     QOLDVV=1.
  16935.     QCAC=1
  16936.     OSWIT=0
  16937.     OCNTR=0
  16938.     ILNFG=0
  16939.     ILNCT=0
  16940.     IC1POS=0
  16941.     IC2POS=0
  16942.     RETURN
  16943.     END
  16944. c -h- dtrcmd.for    Fri Aug 22 13:04:33 1986    
  16945. C DATATRIEVE INTERFACE FUNCTIONS
  16946. C NON-DATATRIEVE PARTS, FOR MSDOS VERSION
  16947. C
  16948. C THIS IS THE NON-DTR VERSION with dummy entry points for
  16949. C the DTR functions BUT supplying the new non-DTR functions
  16950. c completely.
  16951.     SUBROUTINE DTRCMD(LINE)
  16952.     CHARACTER*1 LINE(80)
  16953.     CHARACTER*62 LINEC
  16954. C    EQUIVALENCE(LINEC(1:1),LINE(1))
  16955. C    INCLUDE 'VKLUGPRM.FTN'
  16956. C COPYRIGHT (C) 1983 GLENN EVERHART
  16957.     INTEGER RETCD
  16958. C
  16959. C DEFINE FILE AREAS FOR MAPPING FILES...
  16960. C ONE INPUT FILE, TO BE ACCESSED AS A RANDOM ACCESS FILE OF 128 BYTE
  16961. C RECORDS OF DATA IF RANDOM, OR AS A FORMULA FILE IF SEQUENTIAL, AND
  16962. C ONE OUTPUT FILE TO BE WRITTEN THE SAME WAY. INPUT FILE CAN BE
  16963. C INPUT - ONLY OR READ/WRITE.
  16964. C
  16965. C DEFINE ALSO DATA STRUCTURES TO HOLD CELL RANGES (IN ROW AND COL)
  16966. C TO BE TREATED WITH THESE FILES, FLAG FOR HOW-OPEN, AND LUN USED.
  16967. C
  16968. C MFIOPN =    0    IF NOT OPEN
  16969. C        1    IF OPEN FOR READ ONLY, SEQUENTIAL
  16970. C        2    IF OPEN READ ONLY, RANDOM
  16971. C        3    IF OPEN READ/WRITE, RANDOM.
  16972. C
  16973. C MFOOPN =    0    IF NOT OPEN
  16974. C        1    IF OPEN WRITE SEQUENTIAL
  16975. C        2    IF OPEN WRITE RANDOM
  16976. C
  16977. C OTHER OPTIONS DON'T MAKE SENSE.
  16978. C MFIRL,MFIRH = RRW DIMENSION LOW, HIGH BOUND, INPUT FILE
  16979. C MFICL,MFICH = RCL DIMENSION LOW, HIGH BOUND, INPUT FILE
  16980. C MFORL,RH,MFOCL,CH = OUT FILE BOUNDS
  16981. C MFILUN,MFOLUN ARE LOGICAL UNITS.
  16982.     InTeGer*4 MFIOPN,MFIRL,MFIRH,MFICL,MFICH
  16983.     InTeGer*4 MFOOPN,MFORL,MFORH,MFOCL,MFOCH
  16984.  
  16985.     InTeGer*4 MFILUN,MFOLUN,MFIFLG,MFOFLG
  16986.     COMMON/MFILES/MFIOPN,MFOOPN,MFIRL,MFIRH,MFICL,MFICH,
  16987.      1  MFORL,MFORH,MFOCL,MFOCH,MFILUN,MFOLUN,MFIFLG,MFOFLG
  16988. C
  16989. C
  16990.     CHARACTER*1 AVBLS(20,27),WRK(128),VBLS(8,1,1)
  16991.     InTeGer*4 TYPE(1,1),VLEN(9)
  16992.     REAL*8 XAC,XVBLS(1,1)
  16993.     REAL*8 TAC,UAC,VAC,WAC,YAC
  16994.     REAL*8 TMP
  16995.     INTEGER*4 JVBLS(2,1,1)
  16996.     EQUIVALENCE(WAC,AVBLS(1,23)),(YAC,AVBLS(1,25))
  16997.     EQUIVALENCE(XAC,AVBLS(1,27))
  16998.     EQUIVALENCE(TAC,AVBLS(1,20))
  16999.     EQUIVALENCE(UAC,AVBLS(1,21))
  17000.     EQUIVALENCE(VAC,AVBLS(1,22))
  17001.     EQUIVALENCE(VBLS(1,1,1),JVBLS(1,1,1))
  17002.     EQUIVALENCE(VBLS(1,1,1),XVBLS(1,1))
  17003.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  17004. CCC    InTeGer*4 XTNCNT,XTCFG,IPSET
  17005. CCC    CHARACTER*1 XTNCMD(80)
  17006. C ***<<<< RDD COMMON START >>>***
  17007.     InTeGer*4 RRWACT,RCLACT
  17008. C    COMMON/RCLACT/RRWACT,RCLACT
  17009.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  17010.      1  IDOL7,IDOL8
  17011. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  17012. C     1  IDOL7,IDOL8
  17013.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  17014. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  17015.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  17016. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  17017. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  17018. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  17019.     InTeGer*4 KLVL
  17020. C    COMMON/KLVL/KLVL
  17021.     InTeGer*4 IOLVL,IGOLD
  17022. C    COMMON/IOLVL/IOLVL
  17023. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  17024. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  17025.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  17026.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  17027.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  17028.      3  k3dfg,kcdelt,krdelt,kpag
  17029. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  17030. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  17031. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  17032. C ***<<< RDD COMMON END >>>***
  17033. CCC    InTeGer*4 IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  17034. CCC    COMMON/DOLLR/IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  17035. CCC    InTeGer*4 RRWACT,RCLACT
  17036. CCC    COMMON/RCLACT/RRWACT,RCLACT
  17037. C ***<<< XVXTCD COMMON START >>>***
  17038.     CHARACTER*1 OARRY(100)
  17039.     InTeGer*4 OSWIT,OCNTR
  17040. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  17041. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  17042.     InTeGer*4 IPS1,IPS2,MODFLG
  17043. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  17044.        InTeGer*4 XTCFG,IPSET,XTNCNT
  17045.        CHARACTER*1 XTNCMD(80)
  17046. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  17047. C VARY FLAG ITERATION COUNT
  17048.     INTEGER KALKIT
  17049. C    COMMON/VARYIT/KALKIT
  17050.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  17051.     InTeGer*4 RCMODE,IRCE1,IRCE2
  17052. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  17053. C     1  IRCE2
  17054. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  17055. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  17056. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  17057. C RCFGX ON.
  17058. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  17059. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  17060. C  AND VM INHIBITS. (SETS TO 1).
  17061.     INTEGER*4 FH
  17062. C FILE HANDLE FOR CONSOLE I/O (RAW)
  17063. C    COMMON/CONSFH/FH
  17064.     CHARACTER*1 ARGSTR(52,4)
  17065. C    COMMON/ARGSTR/ARGSTR
  17066.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  17067.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  17068.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  17069.      3  IRCE2,FH,ARGSTR
  17070. C ***<<< XVXTCD COMMON END >>>***
  17071. CCC    InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  17072. CCC    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE
  17073. CCC    COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  17074. C LOOP CONTROL FOR VARY FUNCTION. SET ZERO IN SPREDSHT AND
  17075. C MUST BE SET POSITIVE HERE IF WE NEED ITERATIONS.
  17076. C (IMPLEMENT FOR VAX ONLY)
  17077. CCC    INTEGER KALKIT
  17078. CCC    COMMON/VARYIT/KALKIT
  17079. C ARGUMENTS COME IN IN ARGUMENTS IN LINE
  17080. C RESULTS GO INTO PERCENT (XAC) AND WHEREVER ELSE DESIRED...
  17081. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  17082. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  17083.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  17084.     COMMON/D2R/NRDSP,NCDSP
  17085. C ***<<< KLSTO COMMON START >>>***
  17086.     InTeGer*4 DLFG
  17087. C    COMMON/DLFG/DLFG
  17088.     InTeGer*4 KDRW,KDCL
  17089. C    COMMON/DOT/KDRW,KDCL
  17090.     InTeGer*4 DTRENA
  17091. C    COMMON/DTRCMN/DTRENA
  17092.     REAL*8 EP,PV,FV
  17093.     DIMENSION EP(20)
  17094.     INTEGER*4 KIRR
  17095. C    COMMON/ERNPER/EP,PV,FV,KIRR
  17096.     InTeGer*4 LASTOP
  17097. C    COMMON/ERROR/LASTOP
  17098.     CHARACTER*1 FMTDAT(9,76)
  17099. C    COMMON/FMTBFR/FMTDAT
  17100.     CHARACTER*1 EDNAM(16)
  17101. C    COMMON/EDNAM/EDNAM
  17102.     InTeGer*4 MFID(2),MFMOD(2)
  17103. C    COMMON/FRM/MFID,MFMOD
  17104.     InTeGer*4 JMVFG,JMVOLD
  17105. C    COMMON/FUBAR/JMVFG,JMVOLD
  17106.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  17107.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  17108. C ***<<< KLSTO COMMON END >>>***
  17109. CCC    InTeGer*4 DTRENA
  17110. CCC    COMMON/DTRCMN/DTRENA
  17111.     CHARACTER *1 LINECL(82)
  17112. C    CHARACTER*70 LINEC
  17113.     EQUIVALENCE(LINEC(1:1),LINECL(1))
  17114. C    CHARACTER*80 SCRBUF
  17115.     CHARACTER*1 LBUF(128)
  17116.     CHARACTER*1 MBUF(128)
  17117.     CHARACTER*110 CLBUF,CMBUF
  17118.     CHARACTER*50 CCLBUF,CCMBUF
  17119.     CHARACTER*11 C11LBF
  17120. C    EQUIVALENCE(C11LBF(1:1),CLBUF(1:1))
  17121.     EQUIVALENCE(CLBUF(1:1),CCLBUF(1:1),LBUF(1),C11LBF(1:1)),
  17122.      1  (CMBUF(1:1),CCMBUF(1:1),MBUF(1))
  17123. C    EQUIVALENCE(CLBUF,LBUF(1)),(CMBUF,MBUF(1))
  17124. C USE CLBUF, CMBUF FOR CHARACTER COMPARISONS...
  17125.     CHARACTER*9 FMTB
  17126.     EQUIVALENCE (FMTB(1:1),LBUF(120))
  17127.     CHARACTER*11 FMTBF
  17128.     CHARACTER*1 IFVLD
  17129. C NULL OUT ANY TRAILING BLANKS ON COMMAND LINE
  17130. ccc    DO 3332 N=1,80
  17131. ccc    NN=81-N
  17132. ccc    IF(ICHAR(LINE(NN)).GT.32)GOTO 3333
  17133. ccc    LINE(NN)=CHAR(0)
  17134. ccc3332    CONTINUE
  17135. ccc3333    CONTINUE
  17136. C SPACE FILL ENTIRE ARRAY
  17137.     DO 3334 N=1,82
  17138. 3334    LINECL(N)=CHAR(32)
  17139.     RETCD=1
  17140. C HANDLE DTRCMD FUNCTIONS. LINE ARRAY PASSED IN HERE
  17141. C STARTS AFTER THE "DTR" SO WE CAN DECODE IT.
  17142. C EXECUTE DTR COMMAND
  17143. C  DTRCMD (COMMAND) GIVES DTR COMMAND FACILITY AT COMMAND
  17144. C LEVEL.
  17145. C ALLOW DTRIMM COMMAND TO USE DTR IMMEDIATE TERMINAL
  17146. C INTERFACE. THE REST CAN USE SAME COMMAND NAMES AS AFTER
  17147. C THE "DB" IN *U DBXXXX COMMANDS.
  17148. 500    CONTINUE
  17149. C ENABLE/DISABLE FOR DTR FUNCTIONS
  17150. C SETTING DTRENA TO -1 IMPLIES DISABLE FUNCTIONS
  17151.     CALL SCMP(LINE,'ENA',3,ICODE)
  17152.     IF(ICODE.NE.1)GOTO 600
  17153.     DTRENA=1
  17154.     GOTO 9999
  17155. 600    CONTINUE
  17156.     CALL SCMP(LINE,'DIS',3,ICODE)
  17157.     IF(ICODE.NE.1)GOTO 700
  17158.     DTRENA=-1
  17159.     GOTO 9999
  17160. 700    CONTINUE
  17161.     CALL SCMP(LINE,'OPINS',5,ICODE)
  17162. C OPEN INPUT SEQUENTIAL
  17163.     IF(ICODE.NE.1)GOTO 3800
  17164. C DTROPINS RANGE FILENAME
  17165.     IBGN=6
  17166.     IVLD=0
  17167.     CALL GMTX(LINE,IBGN,LSTCH,MFIRL,MFICL,MFIRH,MFICH,IVLD)
  17168.     IF(IVLD.EQ.3)GOTO 9990
  17169.     LINE(LSTCH+25)=CHAR(0)
  17170.     OPEN(UNIT=MFILUN,FILE=LINE(LSTCH),ACCESS='SEQUENTIAL',
  17171.      1  STATUS='OLD',IOSTAT=IVVV)
  17172.     IF(IVVV.NE.0)GOTO 9990
  17173.     MFIOPN=1
  17174.     GOTO 9999
  17175. 3800    CONTINUE
  17176.     CALL SCMP(LINE,'OPINRR',6,ICODE)
  17177. C OPEN IN RANDOM READ
  17178.     IF(ICODE.NE.1)GOTO 3900
  17179.     KK=2
  17180.     GOTO 3910
  17181. 3900    CONTINUE
  17182.     CALL SCMP(LINE,'OPINRU',6,ICODE)
  17183. C OPEN IN RANDOM UPDATE
  17184.     IF(ICODE.NE.1)GOTO 3950
  17185.     KK=3
  17186. 3910    CONTINUE
  17187. C HANDLE INPUT DIRECT ACCESS OPEN COMMONLY FOR READ ONLY AND R/W
  17188.     IBGN=7
  17189.     IVLD=0
  17190.     CALL GMTX(LINE,IBGN,LSTCH,MFIRL,MFICL,MFIRH,MFICH,IVLD)
  17191.     IF(IVLD.EQ.3)GOTO 9990
  17192. C *******
  17193. C NEED HERE TO MOVE NAME INTO CHAR ARRAY...
  17194.     DO 5601 NN=1,50
  17195. 5601    MBUF(NN)=' '
  17196.     DO 5602 NN=1,25
  17197. 5602    MBUF(NN)=LINE(LSTCH+NN-1)
  17198. C    LINE(LSTCH+25)=0
  17199. C    NBK=(MFIRH-MFIRL+1)*(MFICH-MFICL+1)
  17200. C    OPEN(UNIT=MFILUN,FILE=CCMBUF,ACCESS='BINARY',
  17201. C     1  INITIALSIZE=NBK,FORM='UNFORMATTED',STATUS='OLD',
  17202. C     1  RECL=128,BLOCKSIZE=128,ERR=9990)
  17203.     OPEN(UNIT=MFILUN,FILE=CCMBUF(1:49),ACCESS='DIRECT',
  17204.      1  STATUS='OLD',FORM='UNFORMATTED',RECL=128,
  17205.      1  IOSTAT=IVVV)
  17206.     IF(IVVV.NE.0)GOTO 9990
  17207.     MFIOPN=KK
  17208.     GOTO 9999
  17209. 3950    CONTINUE
  17210.     CALL SCMP(LINE,'OPOUTS',6,ICODE)
  17211. C OPEN OUTPUT SEQUENTIAL
  17212.     IF(ICODE.NE.1)GOTO 4000
  17213.     IBGN=7
  17214.     IVLD=0
  17215.     CALL GMTX(LINE,IBGN,LSTCH,MFORL,MFOCL,MFORH,MFOCH,IVLD)
  17216.     IF(IVLD.EQ.3)GOTO 9990
  17217. C *******
  17218. C NEED HERE TO MOVE NAME INTO CHAR ARRAY...
  17219. C    LINE(LSTCH+25)=0
  17220.     DO 5603 NN=1,50
  17221. 5603    MBUF(NN)=' '
  17222.     DO 5604 NN=1,25
  17223. 5604    MBUF(NN)=LINE(LSTCH+NN-1)
  17224.     OPEN(UNIT=MFOLUN,FILE=CCMBUF(1:49),ACCESS='SEQUENTIAL',
  17225.      1  STATUS='NEW',IOSTAT=IVVV)
  17226.     IF(IVVV.NE.0)GOTO 9990
  17227.     MFOOPN=1
  17228.     GOTO 9999
  17229. 4000    CONTINUE
  17230.     CALL SCMP(LINE,'OPOUTR',6,ICODE)
  17231. C OPEN OUTPUT RANDOM
  17232.     IF(ICODE.NE.1)GOTO 4100
  17233.     IBGN=7
  17234.     IVLD=0
  17235.     CALL GMTX(LINE,IBGN,LSTCH,MFORL,MFOCL,MFORH,MFOCH,IVLD)
  17236.     IF(IVLD.EQ.3)GOTO 9990
  17237. C    NBK=(MFORH-MFORL+1)*(MFOCH-MFOCL+1)
  17238. C *******
  17239. C NEED HERE TO MOVE NAME INTO CHAR ARRAY...
  17240.     DO 5605 NN=1,50
  17241. 5605    MBUF(NN)=' '
  17242.     DO 5606 NN=1,25
  17243. 5606    MBUF(NN)=LINE(LSTCH+NN-1)
  17244. C    LINE(LSTCH+25)=0
  17245. C    OPEN(UNIT=MFOLUN,FILE=CCMBUF(1:49),ACCESS='DIRECT',
  17246. C     1  INITIALSIZE=NBK,FORM='UNFORMATTED',STATUS='NEW',
  17247. C     1  RECL=32,BLOCKSIZE=128,ERR=9990)
  17248.     OPEN(UNIT=MFOLUN,FILE=CCMBUF,ACCESS='DIRECT',
  17249.      1  STATUS='NEW',FORM='UNFORMATTED',RECL=128,
  17250.      2  IOSTAT=IVVV)
  17251.     IF(IVVV.NE.0)GOTO 9990
  17252.     MFOOPN=2
  17253.     GOTO 9999
  17254. 4100    CONTINUE
  17255.     CALL SCMP(LINE,'CLSOUT',6,ICODE)
  17256. C CLOSE OUTPUT 
  17257.     IF(ICODE.NE.1)GOTO 4200
  17258.     CLOSE(UNIT=MFOLUN)
  17259.     MFOOPN=0
  17260.     GOTO 9999
  17261. 4200    CONTINUE
  17262.     CALL SCMP(LINE,'CLSINP',6,ICODE)
  17263. C CLOSE INPUT 
  17264.     IF(ICODE.NE.1)GOTO 4300
  17265.     CLOSE(UNIT=MFILUN)
  17266.     MFIOPN=0
  17267.     GOTO 9999
  17268. 4300    CONTINUE
  17269.     CALL SCMP(LINE,'ENAOUT',6,ICODE)
  17270. C ENABLE OUTPUT 
  17271.     IF(ICODE.NE.1)GOTO 4400
  17272.     MFOFLG=1
  17273.     GOTO 9999
  17274. 4400    CONTINUE
  17275.     CALL SCMP(LINE,'ENAINP',6,ICODE)
  17276. C ENABLE INPUT 
  17277.     IF(ICODE.NE.1)GOTO 4500
  17278.     MFIFLG=1
  17279.     GOTO 9999
  17280. 4500    CONTINUE
  17281.     CALL SCMP(LINE,'DISINP',6,ICODE)
  17282. C DISABLE INPUT 
  17283.     IF(ICODE.NE.1)GOTO 4510
  17284.     MFIFLG=0
  17285.     GOTO 9999
  17286. 4510    CONTINUE
  17287.     CALL SCMP(LINE,'DISOUT',6,ICODE)
  17288. C DISABLE OUTPUT
  17289.     IF(ICODE.NE.1)GOTO 4520
  17290.     MFOFLG=0
  17291.     GOTO 9999
  17292. 4520    CONTINUE
  17293.     CALL SCMP(LINE,'EDTINP',6,ICODE)
  17294. C ENABLE INPUT FORCE
  17295. C COMMAND
  17296. C DTREDTINP RANGE
  17297. C GETS RANGE, THEN FOR EACH CELL IN RANGE READS IN (BY WRKFIL READ CALL)
  17298. C A CELL, SETS ITS FVLD CODE TO -1 (TO FLAG A TEXT CELL), AND WRITES
  17299. C IT OUT AGAIN.
  17300.     IF(ICODE.NE.1)GOTO 4600
  17301. C FORCE ENABLE OF READIN DURING THIS
  17302.     MFIFLG=1
  17303.     MFOFLG=1
  17304. C ENABLE OUTPUT TOO.
  17305.     IBGN=7
  17306.     IVLD=0
  17307.     CALL GMTX(LINE,IBGN,LSTCH,IXRL,IXCL,IXRH,IXCH,IVLD)
  17308.     IF(IVLD.EQ.3)GOTO 9990
  17309.     DO 4550 N1=IXRL,IXRH
  17310.     DO 4550 N2=IXCL,IXCH
  17311.     CALL REFLEC(N2,N1,IRX)
  17312. C SET THE ELEMENT AS VALID AND READ/WRITE IT ONCE.
  17313.     CALL FVLDST(N1,N2,Char(255))
  17314.     CALL WRKFIL(IRX,LBUF,0)
  17315.     CALL WRKFIL(IRX,LBUF,1)
  17316. 4550    CONTINUE
  17317.     MFIFLG=0
  17318.     MFOFLG=0
  17319.     GOTO 9999
  17320. 4600    CONTINUE
  17321.     CALL SCMP(LINE,'FMTOUT',6,ICODE)
  17322. C FORMAT/WRITE OUTPUT
  17323. C COMMAND
  17324. C DTRFMTOUT RANGE
  17325. C GETS RANGE, THEN FOR EACH CELL IN RANGE READS IN (BY WRKFIL READ CALL)
  17326. C A CELL, SETS ITS FVLD CODE TO -1 (TO FLAG A TEXT CELL), AND WRITES
  17327. C IT OUT AGAIN.
  17328.     IF(ICODE.NE.1)GOTO 4630
  17329.     IVLFG=1
  17330.     GOTO 4740
  17331. 4630    CONTINUE
  17332.     CALL SCMP(LINE,'VALOUT',6,ICODE)
  17333.     IF(ICODE.NE.1)GOTO 4700
  17334. C VALOUT CMD OUTPUTS VALUES WITH LONG D FORMAT
  17335.     IVFLG=2
  17336. C    GOTO 4740
  17337. 4740    CONTINUE
  17338. C FORCE ENABLE OF READIN DURING THIS
  17339.     MFIFLG=1
  17340.     MFOFLG=1
  17341. C ENABLE OUTPUT TOO.
  17342.     IBGN=7
  17343.     IVLD=0
  17344.     CALL GMTX(LINE,IBGN,LSTCH,IXRL,IXCL,IXRH,IXCH,IVLD)
  17345.     IF(IVLD.EQ.3)GOTO 9990
  17346.     DO 4650 N1=IXRL,IXRH
  17347.     DO 4650 N2=IXCL,IXCH
  17348. C FIND INDEX FOR WRKFIL
  17349.     CALL REFLEC(N2,N1,IRX)
  17350. C SET THE ELEMENT AS VALID AND READ/WRITE IT ONCE.
  17351.     CALL XVBLGT(N1,N2,TMP)
  17352. C TMP IS REAL*8 SCRATCH
  17353.     CALL FVLDST(N1,N2,Char(255))
  17354.     CALL WRKFIL(IRX,LBUF,0)
  17355. C HAVING LOADED THE RECORD NOW (GETTING FORMAT, ETC.)
  17356. C NOW GRAB THE VALUE AND SAVE IT...
  17357. C FIRST MOVE THE FORMAT DOWN
  17358. C NOTE LINEC AND LINECL ARE EQUIVALENT BUT LINECL IS CHAR*1
  17359.     DO 4651 N=1,9
  17360.     LBUF(N+1)=LBUF(N+119)
  17361. 4651    CONTINUE
  17362.     LBUF(1)='('
  17363.     LBUF(11)=')'
  17364. c    LBUF(12)=CHAR(0)
  17365. C CHANGE TO USE CHAR VERSION OF LBUF
  17366. C *******
  17367. C FORMAT NOW LIVES IN LOW PART OF LBUF
  17368. C D25.17 FORMAT WOULD DO FOR WRITE
  17369. c    IF(IVLFG.EQ.1)WRITE(LINEC(1:70),C11LBF(1:11),ERR=4652)TMP
  17370.     IF(IVLFG.EQ.1)WRITE(LINEC(1:70),C11LBF,ERR=4652)TMP
  17371.     IF(IVLFG.EQ.2)WRITE(LINEC(1:70),4658,ERR=4652)TMP
  17372. 4658    FORMAT(D25.17)
  17373. C USE BUILTIN FORMAT TO WRITE THE VALUE IF COMMANDED TO DO SO OR
  17374. C USE DISPLAY FORMAT.
  17375. 4652    CONTINUE
  17376.     KK=1
  17377.     DO 4653 N=1,110
  17378. 4653    LBUF(N)=CHAR(0)
  17379.     DO 4654 N=1,60
  17380. C COPY LINECL CHARS TO LBUF, SKIPPING SPACES
  17381.     KKK=JCHAR(LINECL(N))
  17382.     IF(KKK.LE.32)GOTO 4654
  17383.     LBUF(KK)=LINECL(N)
  17384.     KK=KK+1
  17385. 4654    CONTINUE
  17386.     CALL WRKFIL(IRX,LBUF,1)
  17387. 4650    CONTINUE
  17388.     MFIFLG=0
  17389.     MFOFLG=0
  17390.     GOTO 9999
  17391. 4700    CONTINUE
  17392.     CALL SCMP(LINE,'CMPFRM',6,ICODE)
  17393.     IF(ICODE.NE.1)GOTO 4800
  17394. C DBCMPFRM V1:V2
  17395. C RETURNS IN % THE INDEX OF FORMULA 1 IN FORMULA 2
  17396.     IBGN=7
  17397.     IVLD=0
  17398. C USE GMTX TO GET CELL ADDRESSES.
  17399.     CALL GMTX(LINE,IBGN,LSTCH,IXRL,IXCL,IXRH,IXCH,IVLD)
  17400.     IF(IVLD.EQ.3)GOTO 9990
  17401. C IF WE HAVE A COMMA AND ANOTHER MTX USE IT AS LENGTHS
  17402.     CALL REFLEC(IXCL,IXRL,IRXL)
  17403.     CALL REFLEC(IXCH,IXRH,IRXH)
  17404.     IF(LINE(LSTCH).NE.',')GOTO 4780
  17405.     IBGN=LSTCH+1
  17406.     IVLD=0
  17407.     CALL GMTX(LINE,IBGN,LSTCH,IYRL,IYCL,IYRH,IYCH,IVLD)
  17408.     IF(IVLD.EQ.3)GOTO 4780
  17409. C GET THE LENGTHS NOW
  17410.     CALL XVBLGT(IYRL,IYCL,TMP)
  17411.     IF(TMP.LT.1.OR.TMP.GT.109.)GOTO 4780
  17412.     LBUFL=TMP
  17413.     CALL XVBLGT(IYRH,IYCH,TMP)
  17414.     IF(TMP.LT.1.OR.TMP.GT.109.)GOTO 4780
  17415.     MBUFL=TMP
  17416. C IF LENGTHS ARE OK FOR BOTH, THEN USE THEM AND DO THE
  17417. C COMPARISONS BASED ON THAT.
  17418.     GOTO 4770
  17419. 4780    CONTINUE
  17420. C GET INDEX OF EACH ELEMENT...
  17421.     CALL WRKFIL(IRXL,LBUF,0)
  17422.     CALL WRKFIL(IRXH,MBUF,0)
  17423. C LOAD THE 2 FORMULAS.
  17424. C NOW FIND THE ENDS...
  17425.     DO 4750 N=1,110
  17426.     NN=111-N
  17427.     IF(JCHAR(LBUF(NN)).GT.32)GOTO 4751
  17428. 4750    CONTINUE
  17429. 4751    LBUFL=NN
  17430.     DO 4760 N=1,110
  17431.     NN=111-N
  17432.     IF(JCHAR(MBUF(NN)).GT.32)GOTO 4761
  17433. 4760    CONTINUE
  17434. 4761    MBUFL=NN
  17435. 4770    CONTINUE
  17436. c find index pos'n by hand...
  17437.     KK=LBUFL-MBUFL+1
  17438.     DO 4776 NN=1,KK
  17439.     IF(LBUF(NN).NE.MBUF(1))GOTO 4776
  17440.     NNN=MBUFL-1
  17441.     DO 4777 N=1,NNN
  17442.     IVVV=NN+N
  17443.     IF (LBUF(IVVV).NE.MBUF(N+1))GOTO 4778
  17444. 4777    CONTINUE
  17445. C IF WE GALL THRU HERE ANYTIME WE HAVE A MATCH.
  17446. C SINCE NN IS WHAT WE NEED, GO USE IT.
  17447.     GOTO 4779
  17448. 4778    CONTINUE
  17449. 4776    CONTINUE
  17450. C IF NO MATCH, SET NN=0 TO SO FLAG IT AND BUG OUT.
  17451. C
  17452.     NN=0
  17453. 4779    CONTINUE
  17454. C NN IS LOCATION OF SUBSTRING NOW
  17455. C    NN=INDEX(CLBUF(1:LBUFL),CMBUF(1:MBUFL))
  17456. C NN IS LOCATION OF SUBSTRING NOW
  17457.     XAC=NN
  17458. C RETURN RESULT IN % ACCUMULATOR.
  17459.     WAC=0.
  17460.     IF(LLT(CLBUF(1:LBUFL),CMBUF(1:MBUFL)))WAC=-1.
  17461.     IF(LGT(CLBUF(1:LBUFL),CMBUF(1:MBUFL)))WAC=1.
  17462. C RETURN LESS/GREATER/EQUAL IN W ACCUMULATOR FOR POSSIBLE
  17463. C USE IN SORTS, ETC. THUS WE CAN TEST 2 STRINGS BY TESTING W ACCUM.
  17464. C (LEAVES X, Y ALONE SINCE W IS MORE FREQUENTLY FREE.)
  17465.     GOTO 9999
  17466. 4800    CONTINUE
  17467.     CALL SCMP(LINE,'LENFRM',6,ICODE)
  17468.     IF(ICODE.NE.1)GOTO 4900
  17469. C DBLENFRM V1:V2
  17470. C RETURNS LENGTH OF FORMULA IN V1 IN % AND V2
  17471.     IBGN=7
  17472.     IVLD=0
  17473. C USE GMTX TO GET CELL ADDRESSES.
  17474.     CALL GMTX(LINE,IBGN,LSTCH,IXRL,IXCL,IXRH,IXCH,IVLD)
  17475.     IF(IVLD.EQ.3)GOTO 9990
  17476. C IF WE HAVE A COMMA AND ANOTHER MTX USE IT AS LENGTHS
  17477.     CALL REFLEC(IXCL,IXRL,IRXL)
  17478. C GET INDEX OF EACH ELEMENT...
  17479.     CALL WRKFIL(IRXL,LBUF,0)
  17480. C LOAD THE FORMULA.
  17481. C NOW FIND THE END...
  17482.     DO 4850 N=1,110
  17483.     NN=111-N
  17484.     IF(JCHAR(LBUF(NN)).GT.32)GOTO 4851
  17485. 4850    CONTINUE
  17486. 4851    LBUFL=NN
  17487.     TMP=LBUFL
  17488.     XAC=TMP
  17489. C SAVE LENGTH IN OUTPUT CELL. DON'T TOUCH VALIDITY FOR THE CELL.
  17490.     NN=0
  17491. C SEE IF CELL IS VALID AND IF NOT VALID DON'T SAVE ANYTHING IN IT.
  17492.     CALL FVLDGT(IXRH,IXCH,NN)
  17493.     IF(NN.EQ.0)GOTO 9999
  17494.     CALL XVBLST(IXRH,IXCH,TMP)
  17495.     GOTO 9999
  17496. 4900    CONTINUE
  17497.     CALL SCMP(LINE,'TRMFRM',6,ICODE)
  17498.     IF(ICODE.NE.1)GOTO 5000
  17499. C TRIM FORMULA
  17500. C DTRTRMFRM INCELL:OUTCELL,START:END
  17501. C RETURNS TRIMMED FORMULA TO CELL.
  17502.     IBGN=7
  17503.     IVLD=0
  17504. C USE GMTX TO GET CELL ADDRESSES.
  17505.     CALL GMTX(LINE,IBGN,LSTCHR,IXRL,IXCL,IXRH,IXCH,IVLD)
  17506.     IF(IVLD.EQ.3)GOTO 9990
  17507. C GOT CELL HERE...BOTH FOR INPUT AND OUTPUT
  17508.     CALL REFLEC(IXCL,IXRL,IRXL)
  17509. C GET INDEX OF EACH ELEMENT...
  17510.     CALL REFLEC(IXCH,IXRH,IRXH)
  17511.     CALL WRKFIL(IRXL,LBUF,0)
  17512.     LO=LSTCHR+1
  17513.     LHI=LSTCHR+21
  17514.     LSTCHR=LHI
  17515.     CALL VARSCN(LINE,LO,LHI,LSTCHR,JD1,JD2,IVLD)
  17516.     IF(IVLD.EQ.0)GOTO 9990
  17517.     CALL XVBLGT(JD1,JD2,TMP)
  17518.     LOCHR=1
  17519.     IF(TMP.GT.0..AND.TMP.LT.110.)LOCHR=TMP
  17520. C LOCHR = START CHAR
  17521.     LO=LSTCHR+1
  17522.     LHI=LSTCHR+21
  17523.     LSTCHR=LHI
  17524.     CALL VARSCN(LINE,LO,LHI,LSTCHR,JD1,JD2,IVLD)
  17525.     IF(IVLD.EQ.0)GOTO 9990
  17526.     CALL XVBLGT(JD1,JD2,TMP)
  17527.     LHICHR=110
  17528.     IF(TMP.GT.0..AND.TMP.LT.110.)LHICHR=TMP
  17529. C LHICHR IS END CHARACTER
  17530. C NOW ALL ARGS ARE COLLECTED.
  17531. C (IGNORE WHAT WAS DELIMITER...)
  17532. C COPY DESIRED STUFF TO MBUF
  17533.     N=1
  17534.     DO 4910 NN=1,110
  17535.     MBUF(NN)=CHAR(0)
  17536.     IF(NN.LT.LOCHR.OR.NN.GT.LHICHR)GOTO 4910
  17537.     MBUF(N)=LBUF(NN)
  17538.     N=N+1
  17539. C COPY DESIRED PART OF FORMULA TO MBUF WITH THE REST ZEROED.
  17540. 4910    CONTINUE
  17541.     DO 4911 NN=111,128
  17542. 4911    MBUF(NN)=LBUF(NN)
  17543.     CALL WRKFIL(IRXH,MBUF,1)
  17544. C WRITE BUFFER BACK TO CELL AS TRIMMED NOW, GOING TO OUT CELL
  17545. C RATHER THAN INPUT CELL (TO ALLOW REPEATED CALCS TO BE STABLE.)
  17546.     GOTO 9999
  17547. 5000    CONTINUE
  17548.     GOTO 9999
  17549. 9990    RETCD=3
  17550. C ERROR RETURN
  17551. 9999    RETURN
  17552.     END
  17553. c -h- dtrfct.for    Fri Aug 22 13:05:02 1986    
  17554. C DATATRIEVE INTERFACE FUNCTIONS
  17555. C NON-DATATRIEVE PARTS, FOR MSDOS VERSION
  17556. C COPYRIGHT 1986 GCE
  17557.     SUBROUTINE DTRFCT(LINE,RETCD)
  17558.     InTeGer*4 RETCD
  17559.     CHARACTER*1 LINE(80)
  17560.     CHARACTER *1 LINECL(82)
  17561.     CHARACTER*62 LINEC
  17562.     EQUIVALENCE(LINEC(1:1),LINECL(1))
  17563. C
  17564. C
  17565. C DEFINE FILE AREAS FOR MAPPING FILES...
  17566. C
  17567. C DEFINE ALSO DATA STRUCTURES TO HOLD CELL RANGES (IN ROW AND COL)
  17568. C TO BE TREATED WITH THESE FILES, FLAG FOR HOW-OPEN, AND LUN USED.
  17569. C
  17570. C MFIOPN =    0    IF NOT OPEN
  17571. C        1    IF OPEN FOR READ ONLY, SEQUENTIAL
  17572. C        2    IF OPEN READ ONLY, RANDOM
  17573. C        3    IF OPEN READ/WRITE, RANDOM.
  17574. C
  17575. C MFOOPN =    0    IF NOT OPEN
  17576. C        1    IF OPEN WRITE SEQUENTIAL
  17577. C        2    IF OPEN WRITE RANDOM
  17578. C
  17579. C OTHER OPTIONS DON'T MAKE SENSE.
  17580. C MFIRL,MFIRH = RRW DIMENSION LOW, HIGH BOUND, INPUT FILE
  17581. C MFICL,MFICH = RCL DIMENSION LOW, HIGH BOUND, INPUT FILE
  17582. C MFORL,RH,MFOCL,CH = OUT FILE BOUNDS
  17583. C MFILUN,MFOLUN ARE LOGICAL UNITS.
  17584.     InTeGer*4 MFIOPN,MFIRL,MFIRH,MFICL,MFICH
  17585.     InTeGer*4 MFOOPN,MFORL,MFORH,MFOCL,MFOCH
  17586.     InTeGer*4 MFILUN,MFOLUN,MFIFLG,MFOFLG
  17587.     COMMON/MFILES/MFIOPN,MFOOPN,MFIRL,MFIRH,MFICL,MFICH,
  17588.      1  MFORL,MFORH,MFOCL,MFOCH,MFILUN,MFOLUN,MFIFLG,MFOFLG
  17589. C
  17590. C
  17591. C    INCLUDE 'VKLUGPRM.FTN'
  17592. C COPYRIGHT (C) 1983 GLENN EVERHART
  17593. C PERMISSION IS GIVEN TO ANYONE TO USE, DISTRIBUTE, OR COPY THIS
  17594. C PROGRAM FREELY BUT NOT TO SELL IT COMMERICALLY.
  17595.     CHARACTER*1 AVBLS(20,27),WRK(128),VBLS(8,1,1)
  17596.     InTeGer*4 TYPE(1,1),VLEN(9)
  17597.     REAL*8 XAC,XVBLS(1,1)
  17598.     REAL*8 TAC,UAC,VAC,WAC,YAC
  17599.     REAL*8 TMP
  17600.     INTEGER*4 JVBLS(2,1,1)
  17601.     EQUIVALENCE(WAC,AVBLS(1,23)),(YAC,AVBLS(1,25))
  17602.     EQUIVALENCE(XAC,AVBLS(1,27))
  17603.     EQUIVALENCE(TAC,AVBLS(1,20))
  17604.     EQUIVALENCE(UAC,AVBLS(1,21))
  17605.     EQUIVALENCE(VAC,AVBLS(1,22))
  17606.     EQUIVALENCE(VBLS(1,1,1),JVBLS(1,1,1))
  17607.     EQUIVALENCE(VBLS(1,1,1),XVBLS(1,1))
  17608.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  17609. C ***<<<< RDD COMMON START >>>***
  17610.     InTeGer*4 RRWACT,RCLACT
  17611. C    COMMON/RCLACT/RRWACT,RCLACT
  17612.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  17613.      1  IDOL7,IDOL8
  17614. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  17615. C     1  IDOL7,IDOL8
  17616.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  17617. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  17618.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  17619. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  17620. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  17621. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  17622.     InTeGer*4 KLVL
  17623. C    COMMON/KLVL/KLVL
  17624.     InTeGer*4 IOLVL,IGOLD
  17625. C    COMMON/IOLVL/IOLVL
  17626. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  17627. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  17628.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  17629.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  17630.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  17631.      3  k3dfg,kcdelt,krdelt,kpag
  17632. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  17633. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  17634. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  17635. C ***<<< RDD COMMON END >>>***
  17636. CCC    InTeGer*4 XTNCNT,XTCFG,IPSET
  17637. CCC    CHARACTER*1 XTNCMD(80)
  17638. CCC    InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  17639. CCC    InTeGer*4 IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  17640. CCC    COMMON/DOLLR/IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  17641. CCC    InTeGer*4 RRWACT,RCLACT
  17642. CCC    COMMON/RCLACT/RRWACT,RCLACT
  17643. C ***<<< XVXTCD COMMON START >>>***
  17644.     CHARACTER*1 OARRY(100)
  17645.     InTeGer*4 OSWIT,OCNTR
  17646. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  17647. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  17648.     InTeGer*4 IPS1,IPS2,MODFLG
  17649. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  17650.        InTeGer*4 XTCFG,IPSET,XTNCNT
  17651.        CHARACTER*1 XTNCMD(80)
  17652. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  17653. C VARY FLAG ITERATION COUNT
  17654.     INTEGER KALKIT
  17655. C    COMMON/VARYIT/KALKIT
  17656.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  17657.     InTeGer*4 RCMODE,IRCE1,IRCE2
  17658. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  17659. C     1  IRCE2
  17660. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  17661. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  17662. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  17663. C RCFGX ON.
  17664. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  17665. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  17666. C  AND VM INHIBITS. (SETS TO 1).
  17667.     INTEGER*4 FH
  17668. C FILE HANDLE FOR CONSOLE I/O (RAW)
  17669. C    COMMON/CONSFH/FH
  17670.     CHARACTER*1 ARGSTR(52,4)
  17671. C    COMMON/ARGSTR/ARGSTR
  17672.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  17673.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  17674.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  17675.      3  IRCE2,FH,ARGSTR
  17676. C ***<<< XVXTCD COMMON END >>>***
  17677. CCC    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE
  17678. CCC    COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  17679. C LOOP CONTROL FOR VARY FUNCTION. SET ZERO IN SPREDSHT AND
  17680. C MUST BE SET POSITIVE HERE IF WE NEED ITERATIONS.
  17681. C (IMPLEMENT FOR VAX ONLY)
  17682.     INTEGER IVVV
  17683. CCC    COMMON/VARYIT/KALKIT
  17684. C ARGUMENTS COME IN IN ARGUMENTS IN LINE
  17685. C RESULTS GO INTO PERCENT (XAC) AND WHEREVER ELSE DESIRED...
  17686. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  17687. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  17688.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  17689.     COMMON/D2R/NRDSP,NCDSP
  17690. C ***<<< KLSTO COMMON START >>>***
  17691.     InTeGer*4 DLFG
  17692. C    COMMON/DLFG/DLFG
  17693.     InTeGer*4 KDRW,KDCL
  17694. C    COMMON/DOT/KDRW,KDCL
  17695.     InTeGer*4 DTRENA
  17696. C    COMMON/DTRCMN/DTRENA
  17697.     REAL*8 EP,PV,FV
  17698.     DIMENSION EP(20)
  17699.     INTEGER*4 KIRR
  17700. C    COMMON/ERNPER/EP,PV,FV,KIRR
  17701.     InTeGer*4 LASTOP
  17702. C    COMMON/ERROR/LASTOP
  17703.     CHARACTER*1 FMTDAT(9,76)
  17704. C    COMMON/FMTBFR/FMTDAT
  17705.     CHARACTER*1 EDNAM(16)
  17706. C    COMMON/EDNAM/EDNAM
  17707.     InTeGer*4 MFID(2),MFMOD(2)
  17708. C    COMMON/FRM/MFID,MFMOD
  17709.     InTeGer*4 JMVFG,JMVOLD
  17710. C    COMMON/FUBAR/JMVFG,JMVOLD
  17711.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  17712.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  17713. C ***<<< KLSTO COMMON END >>>***
  17714. CCC    InTeGer*4 DTRENA
  17715. CCC    COMMON/DTRCMN/DTRENA
  17716. C    CHARACTER*70 LINEC
  17717.     CHARACTER*1 LBUF(128)
  17718.     CHARACTER*1 MBUF(128)
  17719.     CHARACTER*110 CLBUF,CMBUF
  17720. C    EQUIVALENCE(CLBUF(1:1),LBUF(1)),(CMBUF(1:1),MBUF(1))
  17721.     CHARACTER*50 CCMBUF
  17722.     CHARACTER*11 C11LBF
  17723.     EQUIVALENCE(CCMBUF(1:1),CMBUF(1:1),MBUF(1)),
  17724.      1  (C11LBF(1:1),CLBUF(1:1),LBUF(1))
  17725. C USE CLBUF, CMBUF FOR CHARACTER COMPARISONS...
  17726. c    CHARACTER*1 IFVLD
  17727.     RETCD=1
  17728.     IF(DTRENA.LT.0)GOTO 9999
  17729. C NULL OUT ANY TRAILING BLANKS ON COMMAND LINE
  17730. ccc    DO 3332 N=1,76
  17731. ccc    NN=77-N
  17732. ccc    IF(JCHAR(LINE(NN)).GT.32)GOTO 3333
  17733. ccc    LINE(NN)=CHAR(0)
  17734. ccc3332    CONTINUE
  17735. ccc3333    CONTINUE
  17736. C SPACE FILL ENTIRE ARRAY
  17737.     DO 3334 N=1,82
  17738. 3334    LINECL(N)=CHAR(32)
  17739.     RETCD=1
  17740. C HANDLE *U DBXXXX FUNCTIONS. LINE ARRAY PASSED IN HERE
  17741. C STARTS AFTER THE "DB" SO WE CAN DECODE IT.
  17742. C *U DBCMD (COMMAND) PASSES COMMAND TO DTR FOR ACTION
  17743. C  HOWEVER THIS DOES NOT RETURN A VALUE. USE FOR
  17744. C  SETUP PURPOSES ONLY.
  17745. C
  17746. C NO NEED TO INCLUDE ABILITY TO STORE COMMANDS IN CELLS
  17747. C FOR EDITING SINCE {CELL CONSTRUCT PROVIDES THIS ALREADY.
  17748. C (AND AT COMMAND LEVEL THE __{CELL CONSTRUCT DOES ALSO.)
  17749. 500    CONTINUE
  17750.     CALL SCMP(LINE,'OPINS',5,ICODE)
  17751. C OPEN INPUT SEQUENTIAL
  17752.     IF(ICODE.NE.1)GOTO 3800
  17753. C DTROPINS RANGE FILENAME
  17754.     IBGN=6
  17755.     IVLD=0
  17756.     CALL GMTX(LINE,IBGN,LSTCH,MFIRL,MFICL,MFIRH,MFICH,IVLD)
  17757.     IF(IVLD.EQ.3)GOTO 9990
  17758. C    LINE(LSTCH+25)=CHAR(0)
  17759.     DO 5601 NN=1,50
  17760. 5601    MBUF(NN)=' '
  17761.     DO 5602 NN=1,25
  17762. 5602    MBUF(NN)=LINE(LSTCH+NN-1)
  17763.     OPEN(UNIT=MFILUN,FILE=CCMBUF,ACCESS='SEQUENTIAL',
  17764.      1  STATUS='OLD',IOSTAT=IVVV)
  17765.     IF(IVVV.NE.0)GOTO 9990
  17766.     MFIOPN=1
  17767.     GOTO 9999
  17768. 3800    CONTINUE
  17769.     CALL SCMP(LINE,'OPINRR',6,ICODE)
  17770. C OPEN IN RANDOM READ
  17771.     IF(ICODE.NE.1)GOTO 3900
  17772.     KK=2
  17773.     GOTO 3910
  17774. 3900    CONTINUE
  17775.     CALL SCMP(LINE,'OPINRU',6,ICODE)
  17776. C OPEN IN RANDOM UPDATE
  17777.     IF(ICODE.NE.1)GOTO 3950
  17778.     KK=3
  17779. 3910    CONTINUE
  17780. C HANDLE INPUT DIRECT ACCESS OPEN COMMONLY FOR READ ONLY AND R/W
  17781.  
  17782.     IBGN=7
  17783.     IVLD=0
  17784.     CALL GMTX(LINE,IBGN,LSTCH,MFIRL,MFICL,MFIRH,MFICH,IVLD)
  17785.     IF(IVLD.EQ.3)GOTO 9990
  17786. C    LINE(LSTCH+25)=0
  17787.     DO 5603 NN=1,50
  17788. 5603    MBUF(NN)=' '
  17789.     DO 5604 NN=1,25
  17790. 5604    MBUF(NN)=LINE(LSTCH+NN-1)
  17791. C    NBK=(MFIRH-MFIRL+1)*(MFICH-MFICL+1)
  17792.     OPEN(MFILUN,FILE=CCMBUF(1:49),ACCESS='DIRECT',
  17793.      1  FORM='UNFORMATTED',RECL=128,STATUS='OLD',IOSTAT=IVVV)
  17794.     IF(IVVV.NE.0)GOTO 9990
  17795.     MFIOPN=KK
  17796.     GOTO 9999
  17797. 3950    CONTINUE
  17798.     CALL SCMP(LINE,'OPOUTS',6,ICODE)
  17799. C OPEN OUTPUT SEQUENTIAL
  17800.     IF(ICODE.NE.1)GOTO 4000
  17801.     IBGN=7
  17802.     IVLD=0
  17803.     CALL GMTX(LINE,IBGN,LSTCH,MFORL,MFOCL,MFORH,MFOCH,IVLD)
  17804.     IF(IVLD.EQ.3)GOTO 9990
  17805.     DO 5605 NN=1,50
  17806. 5605    MBUF(NN)=' '
  17807.     DO 5606 NN=1,25
  17808. 5606    MBUF(NN)=LINE(LSTCH+NN-1)
  17809.     OPEN(UNIT=MFOLUN,FILE=CCMBUF,ACCESS='SEQUENTIAL',
  17810.      1  STATUS='NEW',IOSTAT=IVVV)
  17811.     IF(IVVV.NE.0)GOTO 9990
  17812.     MFOOPN=1
  17813.     GOTO 9999
  17814. 4000    CONTINUE
  17815.     CALL SCMP(LINE,'OPOUTR',6,ICODE)
  17816. C OPEN OUTPUT RANDOM
  17817.     IF(ICODE.NE.1)GOTO 4100
  17818.     IBGN=7
  17819.     IVLD=0
  17820.     CALL GMTX(LINE,IBGN,LSTCH,MFORL,MFOCL,MFORH,MFOCH,IVLD)
  17821.     IF(IVLD.EQ.3)GOTO 9990
  17822. C    NBK=(MFORH-MFORL+1)*(MFOCH-MFOCL+1)
  17823. C    LINE(LSTCH+25)=0
  17824.     DO 5607 NN=1,50
  17825. 5607    MBUF(NN)=' '
  17826.     DO 5608 NN=1,25
  17827. 5608    MBUF(NN)=LINE(LSTCH+NN-1)
  17828.     OPEN(MFOLUN,FILE=CCMBUF(1:49),ACCESS='DIRECT',
  17829.      1  STATUS='NEW',FORM='UNFORMATTED',RECL=128,
  17830.      2  IOSTAT=IVVV)
  17831.     IF(IVVV.NE.0)GOTO 9990
  17832.     MFOOPN=2
  17833.     GOTO 9999
  17834. 4100    CONTINUE
  17835.     CALL SCMP(LINE,'CLSOUT',6,ICODE)
  17836. C CLOSE OUTPUT 
  17837.     IF(ICODE.NE.1)GOTO 4200
  17838.     CLOSE(UNIT=MFOLUN)
  17839.     MFOOPN=0
  17840.     GOTO 9999
  17841. 4200    CONTINUE
  17842.     CALL SCMP(LINE,'CLSINP',6,ICODE)
  17843. C CLOSE INPUT 
  17844.     IF(ICODE.NE.1)GOTO 4300
  17845.     CLOSE(UNIT=MFILUN)
  17846.     MFIOPN=0
  17847.     GOTO 9999
  17848. 4300    CONTINUE
  17849.     CALL SCMP(LINE,'ENAOUT',6,ICODE)
  17850. C ENABLE OUTPUT 
  17851.     IF(ICODE.NE.1)GOTO 4400
  17852.     MFOFLG=1
  17853.     GOTO 9999
  17854. 4400    CONTINUE
  17855.     CALL SCMP(LINE,'ENAINP',6,ICODE)
  17856. C ENABLE INPUT 
  17857.     IF(ICODE.NE.1)GOTO 4500
  17858.     MFIFLG=1
  17859.     GOTO 9999
  17860. 4500    CONTINUE
  17861.     CALL SCMP(LINE,'DISINP',6,ICODE)
  17862. C DISABLE INPUT 
  17863.     IF(ICODE.NE.1)GOTO 4510
  17864.     MFIFLG=0
  17865.     GOTO 9999
  17866. 4510    CONTINUE
  17867.     CALL SCMP(LINE,'DISOUT',6,ICODE)
  17868. C DISABLE OUTPUT
  17869.     IF(ICODE.NE.1)GOTO 4520
  17870.     MFOFLG=0
  17871.     GOTO 9999
  17872. 4520    CONTINUE
  17873.     CALL SCMP(LINE,'EDTINP',6,ICODE)
  17874. C ENABLE INPUT FORCE
  17875. C COMMAND
  17876. C DTREDTINP RANGE
  17877. C GETS RANGE, THEN FOR EACH CELL IN RANGE READS IN (BY WRKFIL READ CALL)
  17878. C A CELL, SETS ITS FVLD CODE TO -1 (TO FLAG A TEXT CELL), AND WRITES
  17879. C IT OUT AGAIN.
  17880.     IF(ICODE.NE.1)GOTO 4600
  17881. C FORCE ENABLE OF READIN DURING THIS
  17882.     MFIFLG=1
  17883.     MFOFLG=1
  17884. C ENABLE OUTPUT TOO.
  17885.     IBGN=7
  17886.     IVLD=0
  17887.     CALL GMTX(LINE,IBGN,LSTCH,IXRL,IXCL,IXRH,IXCH,IVLD)
  17888.     IF(IVLD.EQ.3)GOTO 9990
  17889.     DO 4550 N1=IXRL,IXRH
  17890.     DO 4550 N2=IXCL,IXCH
  17891.     CALL REFLEC(N2,N1,IRX)
  17892. C SET THE ELEMENT AS VALID AND READ/WRITE IT ONCE.
  17893.     CALL FVLDST(N1,N2,Char(255))
  17894.     CALL WRKFIL(IRX,LBUF,0)
  17895.     CALL WRKFIL(IRX,LBUF,1)
  17896. 4550    CONTINUE
  17897.     MFIFLG=0
  17898.     MFOFLG=0
  17899.     GOTO 9999
  17900. 4600    CONTINUE
  17901.     CALL SCMP(LINE,'FMTOUT',6,ICODE)
  17902. C FORMAT/WRITE OUTPUT
  17903. C COMMAND
  17904. C DTRFMTOUT RANGE
  17905. C GETS RANGE, THEN FOR EACH CELL IN RANGE READS IN (BY WRKFIL READ CALL)
  17906. C A CELL, SETS ITS FVLD CODE TO -1 (TO FLAG A TEXT CELL), AND WRITES
  17907. C IT OUT AGAIN.
  17908.     IF(ICODE.NE.1)GOTO 4630
  17909.     IVLFG=1
  17910.     GOTO 4740
  17911. 4630    CONTINUE
  17912.     CALL SCMP(LINE,'VALOUT',6,ICODE)
  17913.     IF(ICODE.NE.1)GOTO 4700
  17914. C VALOUT CMD OUTPUTS VALUES WITH LONG D FORMAT
  17915.     IVFLG=2
  17916. C    GOTO 4740
  17917. 4740    CONTINUE
  17918. C FORCE ENABLE OF READIN DURING THIS
  17919.     MFIFLG=1
  17920.     MFOFLG=1
  17921. C ENABLE OUTPUT TOO.
  17922.     IBGN=7
  17923.     IVLD=0
  17924.     CALL GMTX(LINE,IBGN,LSTCH,IXRL,IXCL,IXRH,IXCH,IVLD)
  17925.     IF(IVLD.EQ.3)GOTO 9990
  17926.     DO 4650 N1=IXRL,IXRH
  17927.     DO 4650 N2=IXCL,IXCH
  17928. C FIND INDEX FOR WRKFIL
  17929.     CALL REFLEC(N2,N1,IRX)
  17930. C SET THE ELEMENT AS VALID AND READ/WRITE IT ONCE.
  17931.     CALL XVBLGT(N1,N2,TMP)
  17932. C TMP IS REAL*8 SCRATCH
  17933.     CALL FVLDST(N1,N2,Char(255))
  17934.     CALL WRKFIL(IRX,LBUF,0)
  17935. C HAVING LOADED THE RECORD NOW (GETTING FORMAT, ETC.)
  17936. C NOW GRAB THE VALUE AND SAVE IT...
  17937. C FIRST MOVE THE FORMAT DOWN
  17938. C NOTE LINEC AND LINECL ARE EQUIVALENT BUT LINECL IS CHAR*1
  17939.     DO 4651 N=1,9
  17940.     LBUF(N+1)=LBUF(N+119)
  17941. 4651    CONTINUE
  17942.     LBUF(1)='('
  17943.     LBUF(11)=')'
  17944. c    LBUF(12)=0
  17945. C FORMAT NOW LIVES IN LOW PART OF LBUF
  17946. C D25.17 FORMAT WOULD DO FOR WRITE
  17947. C NEED CHAR VBL FOR FORMAT EQUIV'D TO LOW 12 CHARS OF LBUF
  17948. c    IF(IVLFG.EQ.1)WRITE(LINEC(1:62),C11LBF(1:11),ERR=4652)TMP
  17949.     IF(IVLFG.EQ.1)WRITE(LINEC(1:62),C11LBF,ERR=4652)TMP
  17950.     IF(IVLFG.EQ.2)WRITE(LINEC(1:62),4658,ERR=4652)TMP
  17951. 4658    FORMAT(D25.17)
  17952. C USE BUILTIN FORMAT TO WRITE THE VALUE IF COMMANDED TO DO SO OR
  17953. C USE DISPLAY FORMAT.
  17954. 4652    CONTINUE
  17955.     KK=1
  17956.     DO 4653 N=1,110
  17957. 4653    LBUF(N)=CHAR(0)
  17958.     DO 4654 N=1,60
  17959. C COPY LINECL CHARS TO LBUF, SKIPPING SPACES
  17960.     KKK=JCHAR(LINECL(N))
  17961.     IF(KKK.LE.32)GOTO 4654
  17962.     LBUF(KK)=LINECL(N)
  17963.     KK=KK+1
  17964. 4654    CONTINUE
  17965.     CALL WRKFIL(IRX,LBUF,1)
  17966. 4650    CONTINUE
  17967.     MFIFLG=0
  17968.     MFOFLG=0
  17969.     GOTO 9999
  17970. 4700    CONTINUE
  17971.     CALL SCMP(LINE,'CMPFRM',6,ICODE)
  17972.     IF(ICODE.NE.1)GOTO 4800
  17973. C DBCMPFRM V1:V2
  17974. C RETURNS IN % THE INDEX OF FORMULA 1 IN FORMULA 2
  17975.     IBGN=7
  17976.     IVLD=0
  17977.     LSTCH=78
  17978. C USE GMTX TO GET CELL ADDRESSES.
  17979.     CALL GMTX(LINE,IBGN,LSTCH,IXRL,IXCL,IXRH,IXCH,IVLD)
  17980.     IF(IVLD.EQ.3)GOTO 9990
  17981. C IF WE HAVE A COMMA AND ANOTHER MTX USE IT AS LENGTHS
  17982.     CALL REFLEC(IXCL,IXRL,IRXL)
  17983.     CALL REFLEC(IXCH,IXRH,IRXH)
  17984.     IF(LINE(LSTCH).NE.',')GOTO 4780
  17985.     IBGN=LSTCH+1
  17986.     IVLD=0
  17987.     CALL GMTX(LINE,IBGN,LSTCH,IYRL,IYCL,IYRH,IYCH,IVLD)
  17988.     IF(IVLD.EQ.3)GOTO 4780
  17989. C GET THE LENGTHS NOW
  17990.     CALL XVBLGT(IYRL,IYCL,TMP)
  17991.     IF(TMP.LT.1.OR.TMP.GT.109.)GOTO 4780
  17992.     LBUFL=TMP
  17993.     CALL XVBLGT(IYRH,IYCH,TMP)
  17994.     IF(TMP.LT.1.OR.TMP.GT.109.)GOTO 4780
  17995.     MBUFL=TMP
  17996. C IF LENGTHS ARE OK FOR BOTH, THEN USE THEM AND DO THE
  17997. C COMPARISONS BASED ON THAT.
  17998.     GOTO 4770
  17999. 4780    CONTINUE
  18000. C GET INDEX OF EACH ELEMENT...
  18001.     CALL WRKFIL(IRXL,LBUF,0)
  18002.     CALL WRKFIL(IRXH,MBUF,0)
  18003. C LOAD THE 2 FORMULAS.
  18004. C NOW FIND THE ENDS...
  18005.     DO 4750 N=1,110
  18006.     NN=111-N
  18007.     IF(JCHAR(LBUF(NN)).GT.32)GOTO 4751
  18008. 4750    CONTINUE
  18009. 4751    LBUFL=NN
  18010.     DO 4760 N=1,110
  18011.     NN=111-N
  18012.     IF(JCHAR(MBUF(NN)).GT.32)GOTO 4761
  18013. 4760    CONTINUE
  18014. 4761    MBUFL=NN
  18015. 4770    CONTINUE
  18016. c find index pos'n by hand...
  18017.     KK=LBUFL-MBUFL+1
  18018.     DO 4776 NN=1,KK
  18019.     IF(LBUF(NN).NE.MBUF(1))GOTO 4776
  18020.     NNN=MBUFL-1
  18021.     DO 4777 N=1,NNN
  18022.     IVVV=NN+N
  18023.     IF (LBUF(IVVV).NE.MBUF(N+1))GOTO 4778
  18024. 4777    CONTINUE
  18025. C IF WE GALL THRU HERE ANYTIME WE HAVE A MATCH.
  18026. C SINCE NN IS WHAT WE NEED, GO USE IT.
  18027.     GOTO 4779
  18028. 4778    CONTINUE
  18029. 4776    CONTINUE
  18030. C IF NO MATCH, SET NN=0 TO SO FLAG IT AND BUG OUT.
  18031. C
  18032.     NN=0
  18033. 4779    CONTINUE
  18034. C NN IS LOCATION OF SUBSTRING NOW
  18035. C    NN=INDEX(CLBUF(1:LBUFL),CMBUF(1:MBUFL))
  18036.     XAC=NN
  18037. C RETURN RESULT IN % ACCUMULATOR.
  18038.     WAC=0.
  18039.     IF(LLT(CLBUF(1:LBUFL),CMBUF(1:MBUFL)))WAC=-1.
  18040.     IF(LGT(CLBUF(1:LBUFL),CMBUF(1:MBUFL)))WAC=1.
  18041. C RETURN LESS/GREATER/EQUAL IN W ACCUMULATOR FOR POSSIBLE
  18042. C USE IN SORTS, ETC. THUS WE CAN TEST 2 STRINGS BY TESTING W ACCUM.
  18043. C (LEAVES X, Y ALONE SINCE W IS MORE FREQUENTLY FREE.)
  18044.     GOTO 9999
  18045. 4800    CONTINUE
  18046.     CALL SCMP(LINE,'LENFRM',6,ICODE)
  18047.     IF(ICODE.NE.1)GOTO 4900
  18048. C DBLENFRM V1:V2
  18049. C RETURNS LENGTH OF FORMULA IN V1 IN % AND V2
  18050.     IBGN=7
  18051.     IVLD=0
  18052. C USE GMTX TO GET CELL ADDRESSES.
  18053.     CALL GMTX(LINE,IBGN,LSTCH,IXRL,IXCL,IXRH,IXCH,IVLD)
  18054.     IF(IVLD.EQ.3)GOTO 9990
  18055.     CALL REFLEC(IXCL,IXRL,IRXL)
  18056. C GET INDEX OF EACH ELEMENT...
  18057.     CALL WRKFIL(IRXL,LBUF,0)
  18058. C LOAD THE FORMULA.
  18059. C NOW FIND THE END...
  18060.     DO 4850 N=1,110
  18061.     NN=111-N
  18062.     IF(JCHAR(LBUF(NN)).GT.32)GOTO 4851
  18063. 4850    CONTINUE
  18064. 4851    LBUFL=NN
  18065.     TMP=LBUFL
  18066.     XAC=TMP
  18067. C SAVE LENGTH IN OUTPUT CELL. DON'T TOUCH VALIDITY FOR THE CELL.
  18068.     NN=0
  18069. C SEE IF CELL IS VALID AND IF NOT VALID DON'T SAVE ANYTHING IN IT.
  18070.     CALL FVLDGT(IXRH,IXCH,NN)
  18071.     IF(NN.EQ.0)GOTO 9999
  18072.     CALL XVBLST(IXRH,IXCH,TMP)
  18073.     GOTO 9999
  18074. 4900    CONTINUE
  18075.     CALL SCMP(LINE,'TRMFRM',6,ICODE)
  18076.     IF(ICODE.NE.1)GOTO 5000
  18077. C TRIM FORMULA
  18078. C DTRTRMFRM INCELL:OUTCELL,START:END
  18079. C RETURNS TRIMMED FORMULA TO CELL.
  18080.     IBGN=7
  18081.     IVLD=0
  18082. C USE GMTX TO GET CELL ADDRESSES.
  18083.     CALL GMTX(LINE,IBGN,LSTCHR,IXRL,IXCL,IXRH,IXCH,IVLD)
  18084.     IF(IVLD.EQ.3)GOTO 9990
  18085. C GOT CELL HERE...BOTH FOR INPUT AND OUTPUT
  18086.     CALL REFLEC(IXCL,IXRL,IRXL)
  18087. C GET INDEX OF EACH ELEMENT...
  18088.     CALL REFLEC(IXCH,IXRH,IRXH)
  18089.     CALL WRKFIL(IRXL,LBUF,0)
  18090.     LO=LSTCHR+1
  18091.     LHI=LSTCHR+21
  18092.     LSTCHR=LHI
  18093.     CALL VARSCN(LINE,LO,LHI,LSTCHR,JD1,JD2,IVLD)
  18094.     IF(IVLD.EQ.0)GOTO 9990
  18095.     CALL XVBLGT(JD1,JD2,TMP)
  18096.     LOCHR=1
  18097.     IF(TMP.GT.0..AND.TMP.LT.110.)LOCHR=TMP
  18098. C LOCHR = START CHAR
  18099.     LO=LSTCHR+1
  18100.     LHI=LSTCHR+21
  18101.     LSTCHR=LHI
  18102.     CALL VARSCN(LINE,LO,LHI,LSTCHR,JD1,JD2,IVLD)
  18103.     IF(IVLD.EQ.0)GOTO 9990
  18104.     CALL XVBLGT(JD1,JD2,TMP)
  18105.     LHICHR=110
  18106.     IF(TMP.GT.0..AND.TMP.LT.110.)LHICHR=TMP
  18107. C LHICHR IS END CHARACTER
  18108. C NOW ALL ARGS ARE COLLECTED.
  18109. C (IGNORE WHAT WAS DELIMITER...)
  18110. C COPY DESIRED STUFF TO MBUF
  18111.     N=1
  18112.     DO 4910 NN=1,110
  18113.     MBUF(NN)=CHAR(0)
  18114.     IF(NN.LT.LOCHR.OR.NN.GT.LHICHR)GOTO 4910
  18115.     MBUF(N)=LBUF(NN)
  18116.     N=N+1
  18117. C COPY DESIRED PART OF FORMULA TO MBUF WITH THE REST ZEROED.
  18118. 4910    CONTINUE
  18119.     DO 4911 NN=111,128
  18120. 4911    MBUF(NN)=LBUF(NN)
  18121.     CALL WRKFIL(IRXH,MBUF,1)
  18122. C WRITE BUFFER BACK TO CELL AS TRIMMED NOW, GOING TO OUT CELL
  18123. C RATHER THAN INPUT CELL (TO ALLOW REPEATED CALCS TO BE STABLE.)
  18124.     GOTO 9999
  18125. 5000    CONTINUE
  18126.     GOTO 9999
  18127. 9990    RETCD=3
  18128. C ERROR RETURN
  18129. 9999    RETURN
  18130.     END
  18131. c -h- fft.ftn    Fri Aug 22 13:08:56 1986    
  18132. C  
  18133. C-----------------------------------------------------------------------
  18134. C SUBROUTINE: FOUREA
  18135. C PERFORMS COOLEY-TUKEY FAST FOURIER TRANSFORM
  18136. C-----------------------------------------------------------------------
  18137. C  
  18138.       SUBROUTINE FOUREA(ID1,ID2,IC,IR,IVN,ISI)
  18139. C ID1,ID2 = COORDS OF FIRST CELL. IC AND IR ARE 0, OR 1
  18140. C ONLY ONE OF IC, IR MAY BE NONZERO. (FLAGS HORIZ/VERTICAL
  18141. C DATA AREA)
  18142. C  
  18143. C THE COOLEY-TUKEY FAST FOURIER TRANSFORM IN ANSI FORTRAN
  18144. C  
  18145. C DATA IS A ONE-DIMENSIONAL COMPLEX ARRAY WHOSE LENGTH, N, IS A
  18146. C POWER OF TWO.  ISI IS +1 FOR AN INVERSE TRANSFORM AND -1 FOR A
  18147. C FORWARD TRANSFORM.  TRANSFORM VALUES ARE RETURNED IN THE INPUT
  18148. C ARRAY, REPLACING THE INPUT.
  18149. C TRANSFORM(J)=SUM(DATA(I)*W**((I-1)*(J-1))), WHERE I AND J RUN
  18150. C FROM 1 TO N AND W = EXP (ISI*2*PI*SQRT(-1)/N).  PROGRAM ALSO
  18151. C COMPUTES INVERSE TRANSFORM, FOR WHICH THE DEFINING EXPRESSION
  18152. C IS INVTR(J)=(1/N)*SUM(DATA(I)*W**((I-1)*(J-1))).
  18153. C RUNNING TIME IS PROPORTIONAL TO N*LOG2(N), RATHER THAN TO THE
  18154. C CLASSICAL N**2.
  18155. C AFTER PROGRAM BY BRENNER, JUNE 1967. THIS IS A VERY SHORT VERSION
  18156. C OF THE FFT AND IS INTENDED MAINLY FOR DEMONSTRATION. PROGRAMS
  18157. C ARE AVAILABLE IN THIS COLLECTION WHICH RUN FASTER AND ARE NOT
  18158. C RESTRICTED TO POWERS OF 2 OR TO ONE-DIMENSIONAL ARRAYS.
  18159. C SEE -- IEEE TRANS AUDIO (JUNE 1967), SPECIAL ISSUE ON FFT.
  18160. C  
  18161. C ASSUMES THAT FIRST N/2 ELEMENTS ARE REAL, SECOND COMPLEX...
  18162. C STORES DATA THAT WAY ALSO...
  18163. C
  18164. C      COMPLEX DATA(1)
  18165. C      COMPLEX TEMP, W
  18166. C MAKE THIS A REAL FFT, NOT COMPLEX...
  18167.     REAL*8 DATA(1),TEMP,W,TEMP2,TEMPI,WI
  18168.     InTeGer*4 ID1,ID2,IC,IR,IRX,IRXX,IVN,N
  18169. C SET UP STMT FUNCTIONS...
  18170.     ID1F(K)=ID1+IC*(K-1)
  18171.     ID2F(K)=ID2+IR*(K-1)
  18172.     N=IVN
  18173. C  
  18174. C CHECK FOR POWER OF TWO UP TO 14
  18175. C  
  18176. C INITIALLY SAY ALL OK
  18177.       NN = 1
  18178.       DO 10 I=1,14
  18179.         M = I
  18180.         NN = NN*2
  18181.         IF (NN.EQ.N) GO TO 20
  18182.     IF(NN.GT.N)GOTO 11
  18183.   10  CONTINUE
  18184. 11    CONTINUE
  18185.     N=NN/2
  18186. C USE NEXT SMALLER POWER OF 2 ARRAY...
  18187. C    RETURN
  18188. C HERE BEGINNETH ACTUAL WORK.
  18189. C SET UP DATA COORDS ON THE FLY. NORMALLY I,J RUN IN RANGE 1 TO N
  18190. C SO WHERE K=(I OR J) (I.E., ONE OF THE TWO) WE USE A RELATION
  18191. C ID1V=ID1+IC*(K-1) AND ID2V=ID2+IR*(K-1). WE USE STMT FUNCTIONS
  18192. C ID1F AND ID2F FOR THIS.
  18193.   20  CONTINUE
  18194.     NOV2=N/2
  18195. C  
  18196. C      PI = 4.*ATAN(1.)
  18197.     PI=3.14159265358979323846264
  18198.       FN = NOV2
  18199. C  
  18200. C THIS SECTION PUTS DATA IN BIT-REVERSED ORDER
  18201. C  
  18202.       J = 1
  18203.       DO 80 I=1,NOV2
  18204. C  
  18205. C AT THIS POINT, I AND J ARE A BIT REVERSED PAIR (EXCEPT FOR THE
  18206. C DISPLACEMENT OF +1)
  18207. C  
  18208.     IF(I.GE.J)GOTO 40
  18209. C  
  18210. C EXCHANGE DATA(I) WITH DATA(J) IF I.LT.J.
  18211. C  
  18212.  30    CONTINUE
  18213. C EXCHANGE DATA(J), DATA(I)
  18214.     CALL XVBLGT(ID1F(J),ID2F(J),TEMP)
  18215.     CALL XVBLGT(ID1F(I),ID2F(I),DATA(1))
  18216.     CALL XVBLST(ID1F(J),ID2F(J),DATA(1))
  18217.     CALL XVBLST(ID1F(I),ID2F(I),TEMP)
  18218. C FLIP BOTH REAL AND COMPLEX PARTS OF DATA
  18219.     CALL XVBLGT(ID1F(J+NOV2),ID2F(J+NOV2),TEMP)
  18220.     CALL XVBLGT(ID1F(I+NOV2),ID2F(I+NOV2),DATA(1))
  18221.     CALL XVBLST(ID1F(J+NOV2),ID2F(J+NOV2),DATA(1))
  18222.     CALL XVBLST(ID1F(I+NOV2),ID2F(I+NOV2),TEMP)
  18223. C  30    TEMP = DATA(J)
  18224. C        DATA(J) = DATA(I)
  18225. C        DATA(I) = TEMP
  18226. C  
  18227. C IMPLEMENT J=J+1, BIT-REVERSED COUNTER
  18228. C  
  18229.   40    M = NOV2/2
  18230.   50    IF (J.LE.M) GOTO 70
  18231.   60    J = J - M
  18232.         M = (M+1)/2
  18233.         GO TO 50
  18234.   70    J = J + M
  18235.   80  CONTINUE
  18236. C  
  18237. C NOW COMPUTE THE BUTTERFLIES
  18238. C  
  18239.       MMAX = 1
  18240.   90  IF (MMAX.GE.NOV2)GOTO 130
  18241.  100  ISTEP = 2*MMAX
  18242.       DO 120 M=1,MMAX
  18243.         THETA = PI*FLOAT(ISI*(M-1))/FLOAT(MMAX)
  18244.      W = COS(THETA)
  18245.         WI = SIN(THETA)
  18246. C        W = CMPLX(COS(THETA),SIN(THETA))
  18247.         DO 110 I=M,NOV2,ISTEP
  18248.           J = I + MMAX
  18249. C GET REAL AND IMAG HALVES OF NUMBER...
  18250.       CALL XVBLGT(ID1F(J),ID2F(J),TEMP)
  18251.       CALL XVBLGT(ID1F(J+NOV2),ID2F(J+NOV2),TEMPI)
  18252. C DO COMPLEX MULTIPLICATION BY HAND TO AVOID LARGE RUNTIME SYSTEM
  18253. C ROUTINE INCLUSION.
  18254.       TEMP2=W*TEMP-WI*TEMPI
  18255.       TEMPI=WI*TEMP+W*TEMPI
  18256.     TEMP=TEMP2
  18257. C          TEMP = W*DATA(J)
  18258. C          DATA(J) = DATA(I) - TEMP
  18259. C          DATA(I) = DATA(I) + TEMP
  18260.        CALL XVBLGT(ID1F(I),ID2F(I),DATA(1))
  18261.        TEMP2=DATA(1)+TEMP
  18262.        DATA(1)=DATA(1) - TEMP
  18263.        CALL XVBLST(ID1F(J),ID2F(J),DATA(1))
  18264.        CALL XVBLST(ID1F(I),ID2F(I),TEMP2)
  18265. C COMPLEX PART
  18266.        CALL XVBLGT(ID1F(I+NOV2),ID2F(I+NOV2),DATA(1))
  18267.        TEMP2=DATA(1)+TEMPI
  18268.        DATA(1)=DATA(1) - TEMPI
  18269.        CALL XVBLST(ID1F(J+NOV2),ID2F(J+NOV2),DATA(1))
  18270.        CALL XVBLST(ID1F(I+NOV2),ID2F(I+NOV2),TEMP2)
  18271.  110    CONTINUE
  18272.  120  CONTINUE
  18273.       MMAX = ISTEP
  18274.       GO TO 90
  18275.   130  IF (ISI.LT.0) GOTO 160
  18276. C  
  18277. C FOR INV TRANS -- ISI=1 -- MULTIPLY OUTPUT BY 1/N
  18278. C  
  18279.  140  DO 150 I=1,N
  18280. C        DATA(I) = DATA(I)/FN
  18281.     CALL XVBLGT(ID1F(I),ID2F(I),TEMP)
  18282.     TEMP=TEMP/FN
  18283.     CALL XVBLST(ID1F(I),ID2F(I),TEMP)
  18284.  150  CONTINUE
  18285.  160  RETURN
  18286.       END
  18287. c -h- help.for    Fri Aug 22 13:20:10 1986    
  18288.     SUBROUTINE HELP(LVL)
  18289. C PRINT HELP INFO ON SCREEN USING FIRST 22 LINES. ASSUME XQTCMD INVALIDATES
  18290. C THE DISPLAY.
  18291. C COPYRIGHT (C) 1983 GLENN AND MARY EVERHART
  18292.     CHARACTER*1 FORM(128)
  18293.     CALL UVT100(18,0,0)
  18294.     CALL UVT100(11,2,0)
  18295.     CALL UVT100(1,1,1)
  18296. C COPYRIGHT (C) 1983 GLENN and MARY EVERHART
  18297. C All Rights Reserved
  18298. C
  18299. C NEW PC HELP FILE
  18300. C DESIGNED TO BE SMALLER THAN OLD VERSION. READS FILES OFF DISK
  18301. C BY SKIPPING N*24 LINES AND DISPLAYING 24 LINES, WHERE N=LVL
  18302. C ASSUME HELP FILE ON DISK LOGGED CURRENTLY
  18303.     CLOSE(3)
  18304. c for now, assume help file lives on same disk as our default.
  18305.     IXXX=0
  18306.     OPEN(3,FILE='PCCHELP.HLP',STATUS='OLD',ACCESS='DIRECT',
  18307.      1  FORM='UNFORMATTED',RECL=128,IOSTAT=IXXX)
  18308. C try on dk: if we can't find it in default.
  18309.     If(IXXX.LE.0)goto 2772
  18310.     Close(3)
  18311.     OPEN(3,FILE='DK:PCCHELP.HLP',STATUS='OLD',ACCESS='DIRECT',
  18312.      1  FORM='UNFORMATTED',RECL=128,IOSTAT=IXXX)
  18313.     IF(IXXX.GT.0)RETURN
  18314. 2772    Continue
  18315. C RETURN IF HELP FILE IS MISSING...
  18316. C USE A FIXED HELP FILE FOR MULTISCREEN HELP. LOWER OVERHEAD,...
  18317.     NSKP=LVL*24
  18318. C NOW READ IN THE DATA, WRITE TO SCREEN.
  18319.     KKL=NSKP+1
  18320.     KKH=NSKP+23
  18321. C JUST GO DIRECTLY TO THE DESIRED SCREENFUL OF INFO.
  18322.     DO 7640 KKK=KKL,KKH
  18323.     READ(3,REC=KKK,END=7642,ERR=7642)FORM
  18324. c use fortran writes here normally since we want the crlf stuff they imply
  18325. c always write 24 lines to scroll all else off...
  18326.     IVVV=78
  18327. C FIND END OF LINE AND ONLY EMIT CHARACTERS TO THAT; DON'T WASTE
  18328. C TIME DRAWING SPACES ON THE SCREEN.
  18329.     DO 772 IV=1,78
  18330.     IVVV=79-IV
  18331.     IF(ICHAR(FORM(IVVV)).GT.32)GOTO 773
  18332. 772    CONTINUE
  18333. 773    CONTINUE
  18334.     FORM(IVVV+1)=Char(13)
  18335.     FORM(IVVV+2)=Char(10)
  18336.     IVVV=IVVV+2
  18337.     CALL SWRT(FORM,IVVV)
  18338. C    WRITE(11,7643)(FORM(IV),IV=1,IVVV)
  18339. C NOTE WE HAVE LUN 6 OPENED AS CON: IN THE MAIN PROGRAM TO GIVE AN
  18340. C INDEPENDENT TERMINAL OUTPUT CHANNEL. HOPEFULLY THIS PREVENTS SOME
  18341. C SCREWUPS DUE TO USING LUN 0 FOR BOTH CONSOLE INPUT AND OUTPUT; END OF
  18342. C RECORDS OUGHT TO BE INDEPENDENT THIS WAY (I HOPE).
  18343. C7643    FORMAT(1X,82A1,4A1)
  18344. 7640    CONTINUE
  18345. 7642    CONTINUE
  18346.     CLOSE(3)
  18347.     FORM(1)=13
  18348.     CALL SWRT(FORM,1)
  18349.     RETURN
  18350.     END
  18351. c -h- linfit.for    Fri Aug 22 13:23:55 1986    
  18352. C LINE FITTING SUBROUTINE WITH ERROR MEASURE RETURN ALSO.
  18353.     SUBROUTINE LINFIT(ID1X,ID2X,IRCOL,ID1,ID2,N,A,B,DEL,RR)
  18354.     InTeGer*4 ID1X,ID2X,IRCOL,ID1,ID2,N
  18355.     REAL*8 A,B,DEL,XY,SX2,SX,SY,RR
  18356.     InTeGer*4 IC,IR,KK,KKK,I
  18357.     REAL*8 XI,YI,SY2,EN,WRK
  18358. C FIT LINE TO EQUALLY SPACED POINTS...
  18359. C Y=BX+A
  18360.     SY2=0.
  18361.     EN=N
  18362.     XY=0.
  18363.     SX2=0.
  18364.     SX=0.
  18365.     SY=0.
  18366.     IC=IRCOL
  18367.     IR=1-IRCOL
  18368. C IRCOL IS 0 OR 1 FOR ACROSS OR DOWN
  18369.     DO 10 I=1,N
  18370. C IF ID1X < 0 THEN FORM IT HERE AS ID1+I-1
  18371.     IF (ID1X.GT.0)GOTO 20
  18372. C FORM XI
  18373.     XI=I
  18374.     GOTO 30
  18375. 20    CONTINUE
  18376. C INPUT XI
  18377.     KK=ID1X+IC*(I-1)
  18378.     KKK=ID2X+IR*(I-1)
  18379.     CALL XVBLGT(KK,KKK,XI)
  18380. 30    CONTINUE
  18381. C GET YI IN ANY CASE...
  18382.     KK=ID1+IC*(I-1)
  18383.     KKK=ID2+IR*(I-1)
  18384.     CALL XVBLGT(KK,KKK,YI)
  18385.     XY=XY+XI*YI
  18386. C FORM SUMS NEEDED TO FIT LINE...
  18387.     SX2=SX2+XI*XI
  18388.     SX=SX+XI
  18389.     SY=SY+YI
  18390.     SY2=SY2+YI*YI
  18391. 10    CONTINUE
  18392. C NOW GET SLOPE
  18393.     WRK=((XY-(SX*SY)/EN)/(SX2-(SX*SX)/EN))
  18394.     B=WRK
  18395. C THEN INTERCEPT
  18396.     WRK=(SY/EN)-B*(SX/EN)
  18397.     A=WRK
  18398.     WRK=DSQRT((SY2-(A*SY+B*XY))/EN)
  18399.     DEL=WRK
  18400. C DEL = ERROR OF FIT
  18401.     RR=(EN*XY-SX*SY)/DSQRT((EN*SX2-SX*SX)*(EN*SY2-SY*SY))
  18402. C RR IS CORRELATION COEFFICIENT
  18403.     RETURN
  18404.     END
  18405. c -h- list.for    Fri Aug 22 13:24:14 1986    
  18406.     SUBROUTINE LIST
  18407. C COPYRIGHT (C) 1983 GLENN EVERHART
  18408. C ALL RIGHTS RESERVED
  18409. C 60=MAX REAL ROWS
  18410. C 301=MAX REAL COLS
  18411. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  18412. C VBLS AND TYPE DIMENSIONED 60,301
  18413. C **************************************************
  18414. C *                                                *
  18415. C *              SUBROUTINE  LIST                  *
  18416. C *                                                *
  18417. C **************************************************
  18418. C
  18419. C
  18420. C LISTS THE LEGAL CALC COMMANDS AND GIVES A BRIEF
  18421. C DESCRIPTION OF THEIR FUNCTION.
  18422. C
  18423. C LIST IS CALLED BY CALC
  18424. C
  18425. C    SUBROUTINE LIST
  18426. C
  18427. C
  18428. C NOTE WE USE FORTRAN WRITE HERE SINCE IT SHOULD ONLY HAPPEN IN CALC MODE.
  18429. c    rewind 11
  18430. c    WRITE (11,20)
  18431. c    WRITE (11,30)
  18432. c    rewind 11
  18433.     Call vwrt(char(13)//char(10),2)
  18434.     Call vwrt(
  18435.      1  'Cmds= @file-do file;*C-Comment;*E-exit;*R-Read con',50)
  18436.     Call vwrt(char(13)//char(10),2)
  18437.     Call Vwrt(
  18438.      1  '*S-stop;*V n(bet.0,3)-View Ctl - Higher=see more',48)
  18439.     RETURN
  18440. c20    FORMAT (' CMDS= @FILE-DO FILE;*C-COMMENT;*E-EXIT;*R-READ CON')
  18441. c30    FORMAT (' *S-STOP;*V n(bet.0,3)-VIEW CTL- HIGHER=SEE MORE')
  18442.     END
  18443. c -h- wsset.f40    Fri Aug 22 13:43:11 1986    
  18444.         SUBROUTINE WSSET
  18445. C WORK SHEET MANAGMENT ROUTINES
  18446. C HANDLE SPREADSHEET "IN MEMORY" STORAGE
  18447. C COPYRIGHT (C) GLENN AND MARY EVERHART 1983,1984
  18448. C
  18449. C ALL RIGHTS RESERVED
  18450. C
  18451. C WSSET - INITIALIZE STORAGE TO START CONDITIONS
  18452. C EXPECT IMPLEMENTATION TO USE A COMMON BITMAP AND PROVIDE A VARIABLE
  18453. C NCEL TO TELL HOW MANY CELLS ARE IN USE
  18454. C NEXT BITMAPS IMPLEMENT FVLD
  18455.     Include AParms.Inc
  18456.         CHARACTER*1 FV1(IMP1S),FV2(IMP1S),FV4(IMP1S)
  18457.     CHARACTER*1 FVXX(IMPS3)
  18458.     EQUIVALENCE (FV1(1),FVXX(1)),(FV2(1),FVXX(IMP2S))
  18459.     EQUIVALENCE (FV4(1),FVXX(IMP3S))
  18460.         Common/FVLDM/FVXX
  18461. c        COMMON/FVLDM/FV1,FV2,FV4
  18462. C THE FOLLOWING BITMAP IS FOR TYPE ARRAY, AND INTEGER ARRAY IS FOR
  18463. C TYPES OF AC'S STORAGE:
  18464.         CHARACTER*1 ITYP(IMP1S)
  18465.         InTeGer*4 IATYP(27),LINTGR
  18466.         COMMON/TYP/IATYP,ITYP,LINTGR
  18467.         CHARACTER*1 LBITS(8)
  18468.         COMMON/BITS/LBITS
  18469. C ***<<<< RDD COMMON START >>>***
  18470.     InTeGer*4 RRWACT,RCLACT
  18471. C    COMMON/RCLACT/RRWACT,RCLACT
  18472.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  18473.      1  IDOL7,IDOL8
  18474. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  18475. C     1  IDOL7,IDOL8
  18476.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  18477. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  18478.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  18479. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  18480. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  18481. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  18482.     InTeGer*4 KLVL
  18483. C    COMMON/KLVL/KLVL
  18484.     InTeGer*4 IOLVL,IGOLD
  18485. C    COMMON/IOLVL/IOLVL
  18486. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  18487. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  18488.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  18489.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  18490.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  18491.      3  k3dfg,kcdelt,krdelt,kpag
  18492. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  18493. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  18494. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  18495. C ***<<< RDD COMMON END >>>***
  18496. CCC        InTeGer*4 IPGMAX,LPGMXF
  18497. CCC        COMMON/FILEMX/IPGMAX,LPGMXF
  18498. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  18499. C USE LUN 7 FOR FORMULAS, 9 FOR VALUES FILE IF NEEDED...
  18500. C
  18501. C NEXT ARE BUFFERS FOR HOLDING VALUES, AND MEMORY OCCUPANCY WORDS
  18502. C FOR EACH GIVING THE BLK # IN USE FOR THESE TABLES
  18503. C FORMAT BLOCK (ONE ONLY, 512 BYTES, BUT ORGANIZED AS 76 FORMAT
  18504. C AREAS WITH DATA.
  18505. C ***<<< KLSTO COMMON START >>>***
  18506.     InTeGer*4 DLFG
  18507. C    COMMON/DLFG/DLFG
  18508.     InTeGer*4 KDRW,KDCL
  18509. C    COMMON/DOT/KDRW,KDCL
  18510.     InTeGer*4 DTRENA
  18511. C    COMMON/DTRCMN/DTRENA
  18512.     REAL*8 EP,PV,FV
  18513.     DIMENSION EP(20)
  18514.     INTEGER*4 KIRR
  18515. C    COMMON/ERNPER/EP,PV,FV,KIRR
  18516.     InTeGer*4 LASTOP
  18517. C    COMMON/ERROR/LASTOP
  18518.     CHARACTER*1 FMTDAT(9,76)
  18519. C    COMMON/FMTBFR/FMTDAT
  18520.     CHARACTER*1 EDNAM(16)
  18521. C    COMMON/EDNAM/EDNAM
  18522.     InTeGer*4 MFID(2),MFMOD(2)
  18523. C    COMMON/FRM/MFID,MFMOD
  18524.     InTeGer*4 JMVFG,JMVOLD
  18525. C    COMMON/FUBAR/JMVFG,JMVOLD
  18526.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  18527.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  18528. C ***<<< KLSTO COMMON END >>>***
  18529. CCC        CHARACTER*1 FMTDAT(9,76)
  18530. CCC        COMMON/FMTBFR/FMTDAT
  18531.         CHARACTER*1 DVF(12),DFMT(10)
  18532.         EQUIVALENCE(DVF(2),DFMT(1))
  18533.         COMMON/DEFVBX/DVF
  18534. CCC    InTeGer*4 DLFG
  18535. CCC    COMMON/DLFG/DLFG
  18536. C DLFG IS NONZERO IF ANY D## FORMS HAVE BEEN SEEN
  18537.         InTeGer*4 MPAG(2),MPMOD
  18538.         InTeGer*2 LVALBF(5,MVal)
  18539.     DIMENSION MPMOD(2)
  18540.         COMMON/VB/MPAG,LVALBF,MPMOD
  18541.     InTeGer*4 MFLAST,MFBASE,MVLAST,MVBASE
  18542.     COMMON/VBCTL/MFLAST,MFBASE,MVLASE,MVBASE
  18543. CCC    InTeGer*4 MFID(2)
  18544. C        InTeGer*4 MFID,IFID(8,MFrm)
  18545. C        CHARACTER*1 LFID(16,MFrm)
  18546. C        EQUIVALENCE(IFID(1,1),LFID(1,1))
  18547. CCC        COMMON/FRM/MFID,MFMOD
  18548. C        COMMON/FRM/MFID,IFID
  18549. C
  18550. C ***<<< NULETC COMMON START >>>***
  18551.     InTeGer*4 ICREF,IRREF
  18552. C    COMMON/MIRROR/ICREF,IRREF
  18553.     InTeGer*4 MODPUB,LIMODE
  18554. C    COMMON/MODPUB/MODPUB,LIMODE
  18555.     InTeGer*4 KLKC,KLKR
  18556.     REAL*8 AACP,AACQ
  18557. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  18558.     InTeGer*4 NCEL,NXINI
  18559. C    COMMON/NCEL/NCEL,NXINI
  18560.     CHARACTER*1 NAMARY(20,MRows)
  18561. C    COMMON/NMNMNM/NAMARY
  18562.     InTeGer*4 NULAST,LFVD
  18563. C    COMMON/NULXXX/NULAST,LFVD
  18564.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  18565.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  18566. C ***<<< NULETC COMMON END >>>***
  18567. CCC        COMMON /NCEL/NCEL,NXINI
  18568.     LINTGR=0
  18569.     MPMOD(1)=0
  18570.     MPMOD(2)=0
  18571.     MFMOD(1)=0
  18572.     MFMOD(2)=0
  18573.     DLFG=0
  18574.         IBP=1
  18575. C INITIALIZE ADDRESSES FOR FVLDSG/FVLDGT
  18576. C    CALL FVGO(FV1,LBITS)
  18577.         DO 2 N=1,9
  18578. 2       FMTDAT(N,1)=DFMT(N)
  18579.         DO 3 N=2,76
  18580.         DO 3 NN=1,9
  18581. 3       FMTDAT(NN,N)=CHAR(0)
  18582.         DO 1 N=1,8
  18583.     NN=128/IBP
  18584.         LBITS(N)=CHAR(NN)
  18585. 1       IBP=IBP+IBP
  18586.         DO 4 N=1,IMP1S
  18587. C CLEAR BITMAPS NOW
  18588.         FV1(N)=CHAR(0)
  18589.         FV2(N)=CHAR(0)
  18590.         FV4(N)=CHAR(0)
  18591. 4       ITYP(N)=CHAR(0)
  18592. C OPEN THE WORK FILES SO WE DON'T NEED TO LATER...
  18593. C LUN 7 IS FORMULAS; LUN 9 IS VALUES
  18594. C HOWEVER, IF IPGMAX IS LESS THAN 800/205 (INDICATING ENTIRE FILE
  18595. C FITS IN MEMORY) DON'T OPEN LUN 9 AND IF LPGMXF IS < 2048/64, LIKEWISE
  18596. C FOR LUN 7.
  18597. C INITIALLY CLOSE FILES IN CASE THEY WERE OPEN...
  18598.         CLOSE(7,STATUS='DELETE')
  18599.         CLOSE(13,STATUS='DELETE')
  18600. C NOW OPEN THEM AS RANDOM ACCESS FILES.
  18601.         NBK=IPGMAX*2
  18602. C KEEP VALUE PAGES IN 500 BYTE UNITS, NOT 512 BYTE UNITS, TO COME
  18603. C OUT EVEN...
  18604.         IF(IPGMAX.GT.(MVal/100))OPEN(13,
  18605.      1  ACCESS='DIRECT',FORM='UNFORMATTED',
  18606.      3  RECL=500,STATUS='NEW')
  18607.         NBK=LPGMXF*2
  18608.         IF(LPGMXF.GT.(MFro64))OPEN(7,
  18609.      1  ACCESS='DIRECT',FORM='UNFORMATTED',
  18610.      3  RECL=512,STATUS='NEW')
  18611. C SET NOTHING IN MEMORY YET
  18612.         MFID(1)=0
  18613.     MFID(2)=0
  18614.         MPAG(1)=0
  18615.     MPAG(2)=0
  18616. C MARK BUFFER 1 AS IN MEMORY AND AS LAST-ACCESSED (SO WE FIRST ATTEMPT TO
  18617. C OVERWRITE BUFFER 2 TO GET STARTED.)
  18618.     MFLAST=1
  18619.     MFBASE=0
  18620.     MVLAST=1
  18621.     MVBASE=0
  18622. C ZERO MEMORY BUFFER AND FILES
  18623. C ACTUALLY MARK WITH -1 SO THAT WE CAN TELL WHEN WE HIT A VIRGIN
  18624. C AREA.
  18625.         DO 9 N=1,MVal
  18626.         DO 9 M=1,5
  18627.     KKKKK=-1
  18628. 9       LVALBF(M,N)=KKKKK
  18629.         NPG=(IPGMAX*2)
  18630.         IF(IPGMAX.LE.(MVal/100))GOTO 11
  18631.         DO 10 N=1,NPG
  18632. 10      WRITE(13,REC=N,ERR=11)((LVALBF(K,KKK),K=1,5),KKK=1,50)
  18633. 11      CONTINUE
  18634.     CALL WRKFIL(0,0,50)
  18635. C        DO 12 N=1,2048
  18636. C        DO 12 M=1,8
  18637. C12      IFID(M,N)=0
  18638. C     NPG=LPGMXF*2
  18639. C        IF(LPGMXF.LE.(2048/64))GOTO 14
  18640. C        DO 13 N=1,NPG
  18641. C13      WRITE(7,REC=N,ERR=14)((IFID(K,KKK),K=1,8),KKK=1,32)
  18642. 14      CONTINUE
  18643. C SET ALL AC'S TO TYPE FLOATING...
  18644.         DO 8 N=1,27
  18645. 8       IATYP(N)=2
  18646. C TYPE 2 IS REALS (DEFAULT)
  18647.         NCEL=0
  18648.     NXINI=0
  18649.         RETURN
  18650.         END
  18651. c -h- wtbini.f40    Fri Aug 22 13:43:29 1986    
  18652. C WORK FORMULA TABLE INITIALIZE FOR DTBL1 COMMON
  18653. C COPYRIGHT (C) GLENN AND MARY EVERHART 1985
  18654. C ALL RIGHTS RESERVED
  18655.     SUBROUTINE WTBINI(IFID,LPGMXF,BTBL1,BTBL2,BTBL3,BTBL4,BTBL5,
  18656.      1  BTBL6,BTBL7,BTBL8)
  18657.     Include Aparms.inc
  18658.     CHARACTER*1 DTBL1(9,9,8)
  18659. C BIG WASTEFUL TABLE TO INIT OPERATION TYPE DATA. TRY TO REUSE SPACE.
  18660.     Integer*4 LPGMXF
  18661. C    InTeGer*2 BTBL(6,6,8)
  18662. C REUSE SPACE BY MAKING LFID AND IT OVERLAY EACH OTHER.
  18663. C NO NEED TO WASTE IT.
  18664.     InTeGer*2 IFID(8,MFrm)
  18665. C    CHARACTER*1 LFID(16,MFrm)
  18666. C    EQUIVALENCE(LFID(1,1),IFID(1,1))
  18667. C    EQUIVALENCE(IFID(1,1),BTBL(1,1,1))
  18668.     InTeGer*2 BTBL1(6,6)
  18669.     InTeGer*2 BTBL2(6,6),BTBL3(6,6),BTBL4(6,6),BTBL5(6,6)
  18670.     InTeGer*2 BTBL6(6,6),BTBL7(6,6),BTBL8(6,6)
  18671. C    EQUIVALENCE(BTBL(1,1,1),BTBL1(1,1)),(BTBL(1,1,2),BTBL2(1,1))
  18672. C    EQUIVALENCE(BTBL(1,1,3),BTBL3(1,1)),(BTBL(1,1,4),BTBL4(1,1))
  18673. C    EQUIVALENCE(BTBL(1,1,5),BTBL5(1,1)),(BTBL(1,1,6),BTBL6(1,1))
  18674. C    EQUIVALENCE(BTBL(1,1,7),BTBL7(1,1)),(BTBL(1,1,8),BTBL8(1,1))
  18675.     COMMON /DECIDE/ DTBL1
  18676. C ONLY INIT DTBL1 ENTRIES NOT CORRESPONDING TO MULTIPLE PRECISION DATA
  18677. C TYPES (WHICH ARE NOT SUPPORTED HERE)
  18678.     do 135 n3=1,8
  18679.     do 135 n2=1,9
  18680.     do 135 n1=1,9
  18681. 135    dtbl1(n1,n2,n3)=CHAR(0)
  18682.     DO 35 NN2=1,6
  18683.     N2=NN2
  18684.     IF(NN2.GT.4)N2=NN2+3
  18685.     DO 235 N1=1,4
  18686.     DTBL1(N1,N2,1)=CHAR(BTBL1(N1,NN2))
  18687.     DTBL1(N1,N2,2)=CHAR(BTBL2(N1,NN2))
  18688.     DTBL1(N1,N2,3)=CHAR(BTBL3(N1,NN2))
  18689.     DTBL1(N1,N2,4)=CHAR(BTBL4(N1,NN2))
  18690.     DTBL1(N1,N2,5)=CHAR(BTBL5(N1,NN2))
  18691.     DTBL1(N1,N2,6)=CHAR(BTBL6(N1,NN2))
  18692.     DTBL1(N1,N2,7)=CHAR(BTBL7(N1,NN2))
  18693. 235    DTBL1(N1,N2,8)=CHAR(BTBL8(N1,NN2))
  18694.     do 335 n1=5,6
  18695.     DTBL1(N1+3,N2,1)=CHAR(BTBL1(N1,NN2))
  18696.     DTBL1(N1+3,N2,2)=CHAR(BTBL2(N1,NN2))
  18697.     DTBL1(N1+3,N2,3)=CHAR(BTBL3(N1,NN2))
  18698.     DTBL1(N1+3,N2,4)=CHAR(BTBL4(N1,NN2))
  18699.     DTBL1(N1+3,N2,5)=CHAR(BTBL5(N1,NN2))
  18700.     DTBL1(N1+3,N2,6)=CHAR(BTBL6(N1,NN2))
  18701.     DTBL1(N1+3,N2,7)=CHAR(BTBL7(N1,NN2))
  18702.     DTBL1(N1+3,N2,8)=CHAR(BTBL8(N1,NN2))
  18703. 335    continue
  18704. 35    CONTINUE
  18705. C NOW CLEAR THE BUFFER OUT, HAVING SET UP DTBL1 FROM IT.
  18706. C SET INITIAL -1 SO WE CAN RECOGNIZE WHEN TO STOP LOOKING
  18707. C INITIALLY...
  18708.     DO 36 NN=1,MFrm
  18709.     DO 36 N=1,8
  18710.     KKKKK=-1
  18711. 36    IFID(N,NN)=KKKKK
  18712. C ZERO THE FILE NOW
  18713.     NPG=LPGMXF*2
  18714.         IF(LPGMXF.LE.(MFro64))GOTO 14
  18715.         DO 13 N=1,NPG
  18716. 13      WRITE(7,REC=N,ERR=14)((IFID(K,KKK),K=1,8),KKK=1,32)
  18717. 14      CONTINUE
  18718.     RETURN
  18719.     END
  18720. c -h- wkdy.for    Fri Aug 22 13:44:33 1986    
  18721.     SUBROUTINE WKDY(JULLO,JULHI,NDAYS)
  18722. C GIVEN START AND END JULIAN DATE, FIGURE OUT HOW MANY WEEK DAYS
  18723. C THERE ARE BETWEEN THEM.
  18724.     JL=JULLO
  18725.     JH=JULHI
  18726.     IF(JL.LE.JH)GOTO 10
  18727.     JL=JULHI
  18728.     JH=JULLO
  18729. 10    CONTINUE
  18730.     IDL=(JH-JL)/7
  18731. C GET NUMBER OF WEEKS BETWEEN DAYS, 5 WORKDAYS PER WHOLE WEEK.
  18732.     IWDY=IDL*5
  18733. C ADD 3 SO THAT MODULO OF SUNDAY IS 0, NOT WED.
  18734.     IDOR=JH-JL-7*(IDL)
  18735.     IF(IDOR.NE.0)IDOR=5
  18736. C IDOR IS ORIGINAL # DAYS DIFFERENCE, CORRECTED FOR WHOLE
  18737. C WEEKS ALREADY ALLOWED.
  18738.     LD=JL+3
  18739.     LD=MOD(LD,7)
  18740.     LH=JH+3
  18741.     LH=MOD(LH,7)
  18742. C NOW HAVE DAY OF WEEK START,END. FIND WORK DAYS THAT WEEK (M-F ONLY)
  18743.     IKLU=0
  18744.     IK2=1
  18745.     IF(LD.LT.1)IK2=0
  18746.     IF(LD.LT.1)LD=1
  18747.     IF(LD.GT.5)LD=5
  18748. C FOR HIGH END OF RANGE IF THE END DATE IS SUNDAY SUBTRACT ONE DAY
  18749. C FROM THE DAYS SO WE OMIT THE MONDAY FROM THE RANGE...
  18750.     IF(LH.LT.1)IKLU=IK2
  18751.     IF(LH.LT.1)LH=1
  18752.     IF(LH.GT.5)LH=5
  18753. C LH = DAY ENDED ON, LD=START DAY, FORCED INTO WORK WEEK.
  18754.     IF (LH.GT.LD)IWDY=IWDY+LH-LD-IKLU
  18755.     IF (LH.LE.LD)IWDY=IWDY+IDOR-(LD-LH)-IKLU
  18756. C GIVES DAYS BETWEEN 2 DATES JUST LIKE JULIAN DATE SUBTRACTION FOR
  18757. C CALENDAR DATES.
  18758.     NDAYS=IWDY
  18759.     RETURN
  18760.     END
  18761. c -h- wrkint.for    Fri Aug 22 13:44:46 1986    
  18762.     SUBROUTINE WRKINT(JULLO,NWDY,JULHI)
  18763. C GETS JULLO = START DATE AND NWDY = NO. WORKDAYS (M-F) TO ADD AND
  18764. C FINDS JULHI = END JULIAN DATE, CONSTRAINED TO BE IN MONDAY TO
  18765. C FRIDAY RANGE.
  18766. C MUST ADD 3 BECAUSE THAT'S THE BIAS OF OUR JULIAN DATE BASE.
  18767.     IDJL=MOD(JULLO+3,7)
  18768. C IDJL = DAY CODE OF START DATE
  18769.     NWWK=NWDY/5
  18770.     JL=JULLO
  18771.     IF(IDJL.LT.1)JL=JL+1
  18772.     IF(IDJL.GT.5)JL=JL+2
  18773. C BUMP START INTERVAL...
  18774.     NWDD=NWDY-5*NWWK
  18775.     JL=JL+NWWK*7+NWDD
  18776.     IDJL=MOD(JL+3,7)
  18777.     IF(IDJL.LT.1)JL=JL+1
  18778.     IF(IDJL.GT.5)JL=JL+2
  18779. C FORCE OUTPUT DATE TO BE WITHIN WORKWEEK
  18780.     JULHI=JL
  18781.     RETURN
  18782.     END
  18783. C ****************** AnalyTZ.Ftn ########################################3
  18784. c -h- test.for    Fri Aug 22 13:35:58 1986    
  18785.     SUBROUTINE TEST(LOGTYP,FLAG,V1,V2)
  18786.     InTeGer*4 FLAG
  18787.     REAL*8 V1,V2
  18788.     FLAG=0
  18789.     IF(LOGTYP.EQ.1.AND.V1.GT.V2)FLAG=1
  18790.     IF(LOGTYP.EQ.2.AND.V1.LT.V2)FLAG=1
  18791.     IF(LOGTYP.EQ.3.AND.V1.EQ.V2)FLAG=1
  18792.     IF(LOGTYP.EQ.4.AND.V1.NE.V2)FLAG=1
  18793.     IF(LOGTYP.EQ.5.AND.V1.GE.V2)FLAG=1
  18794.     IF(LOGTYP.EQ.6.AND.V1.LE.V2)FLAG=1
  18795. C TEST LOGICAL RELATIONS FOR IF STATEMENT, FLAG=1 IF TRUE, 0 ELSE.
  18796.     RETURN
  18797.     END
  18798. c -h- ttydei.for    Fri Aug 22 13:35:58 1986    
  18799.     SUBROUTINE TTYDEI
  18800.     INCLUDE DOS.INC
  18801.     INTEGER *4 MODE
  18802.     Integer*4 Amiga
  18803.     External Amiga
  18804. C ***<<< XVXTCD COMMON START >>>***
  18805.     CHARACTER*1 OARRY(100)
  18806.     InTeGer*4 OSWIT,OCNTR
  18807. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  18808. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  18809.     InTeGer*4 IPS1,IPS2,MODFLG
  18810. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  18811.        InTeGer*4 XTCFG,IPSET,XTNCNT
  18812.        CHARACTER*1 XTNCMD(80)
  18813. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  18814. C VARY FLAG ITERATION COUNT
  18815.     INTEGER KALKIT
  18816. C    COMMON/VARYIT/KALKIT
  18817.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  18818.     InTeGer*4 RCMODE,IRCE1,IRCE2
  18819. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  18820. C     1  IRCE2
  18821. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  18822. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  18823. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  18824. C RCFGX ON.
  18825. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  18826. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  18827. C  AND VM INHIBITS. (SETS TO 1).
  18828.     INTEGER*4 FH
  18829. C FILE HANDLE FOR CONSOLE I/O (RAW)
  18830. C    COMMON/CONSFH/FH
  18831.     CHARACTER*1 ARGSTR(52,4)
  18832. C    COMMON/ARGSTR/ARGSTR
  18833.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  18834.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  18835.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  18836.      3  IRCE2,FH,ARGSTR
  18837. C ***<<< XVXTCD COMMON END >>>***
  18838. CCC    COMMON/CONSFH/FH
  18839.     If (FH.ne.0)Call Amiga(Close,FH)
  18840.     RETURN
  18841.     END
  18842. c -h- ttyini.for    Fri Aug 22 13:35:58 1986    
  18843.     SUBROUTINE TTYINI
  18844. C PERFORM INITS ON UNIT 5. NORMALLY EITHER DO NOTHING OR
  18845. C REPLACE WITH SOMETHING THAT WORKS FOR YOUR SYSTEM. TYPICAL
  18846. C ACTIONS:
  18847. C  SET THE TERMINAL NOT TO WRAP AROUND
  18848. C  ATTACH TERMINAL SO TYPE-AHEAD WORKS
  18849. C  SET UP TERMINAL TO MUNGE AROUND THE ESCAPE SEQUENCES TO ALLOW
  18850. C  SPECIAL FUNCTION AND/OR ARROW KEYS TO WORK.
  18851. C ULTIMATELY USE WRITE OF UNIT 0 TO DUMP OUT SOME USEFUL ESCAPE SEQS.
  18852. C TO DEFINE FUNCTION KEYS A LA VT100 (SORT OF).
  18853.     INCLUDE DOS.INC
  18854.     CHARACTER*40 NAME
  18855.     INTEGER *4 MODE
  18856.     Integer*4 Amiga
  18857.     External Amiga
  18858. C ***<<< XVXTCD COMMON START >>>***
  18859.     CHARACTER*1 OARRY(100)
  18860.     InTeGer*4 OSWIT,OCNTR
  18861. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  18862. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  18863.     InTeGer*4 IPS1,IPS2,MODFLG
  18864. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  18865.        InTeGer*4 XTCFG,IPSET,XTNCNT
  18866.        CHARACTER*1 XTNCMD(80)
  18867. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  18868. C VARY FLAG ITERATION COUNT
  18869.     INTEGER KALKIT
  18870. C    COMMON/VARYIT/KALKIT
  18871.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  18872.     InTeGer*4 RCMODE,IRCE1,IRCE2
  18873. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  18874. C     1  IRCE2
  18875. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  18876. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  18877. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  18878. C RCFGX ON.
  18879. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  18880. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  18881. C  AND VM INHIBITS. (SETS TO 1).
  18882.     INTEGER*4 FH
  18883. C FILE HANDLE FOR CONSOLE I/O (RAW)
  18884. C    COMMON/CONSFH/FH
  18885.     CHARACTER*1 ARGSTR(52,4)
  18886. C    COMMON/ARGSTR/ARGSTR
  18887.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  18888.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  18889.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  18890.      3  IRCE2,FH,ARGSTR
  18891. C ***<<< XVXTCD COMMON END >>>***
  18892. C ***<<<< RDD COMMON START >>>***
  18893.     InTeGer*4 RRWACT,RCLACT
  18894. C    COMMON/RCLACT/RRWACT,RCLACT
  18895.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  18896.      1  IDOL7,IDOL8
  18897. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  18898. C     1  IDOL7,IDOL8
  18899.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  18900. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  18901.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  18902. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  18903. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  18904. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  18905.     InTeGer*4 KLVL
  18906. C    COMMON/KLVL/KLVL
  18907.     InTeGer*4 IOLVL,IGOLD
  18908. C    COMMON/IOLVL/IOLVL
  18909. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  18910. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  18911.     Integer*4 IDSPTP,Idol9
  18912.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  18913.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  18914.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  18915.      3  k3dfg,kcdelt,krdelt,kpag
  18916. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  18917. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  18918. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9
  18919. C ***<<< RDD COMMON END >>>***
  18920. CCC    COMMON/CONSFH/FH
  18921. c Resize initial windows so all fit on NON interlace screen
  18922.     If(IDSPTP.NE.1)NAME=
  18923.      1  "RAW:0/0/639/199/AnalytiCalc-AMIGA" // CHAR(0)
  18924.     IF(IDSPTP.EQ.1)NAME=
  18925.      1  "RAW:0/0/639/399/AnalytiCalc-AMIGA" // CHAR(0)
  18926.     MODE=MODE_NEWFILE
  18927.     FH=AMIGA(Open,NAME,MODE)
  18928.     RETURN
  18929.     END
  18930. c -h- typget.for    Fri Aug 22 13:35:58 1986    
  18931.         SUBROUTINE TYPGET(ID1,ID2,IVAL)
  18932.     Include AParms.Inc
  18933. C
  18934. C TYPGET - GET TYPE(60,301) ARRAY WORDS BACK
  18935. C RETURN TYPE(ID1,ID2) IN IVAL, BUT NOT REALLY...
  18936. C NEXT BITMAPS IMPLEMENT FVLD
  18937.         CHARACTER*1 FV1(IMP1S),FV2(IMP1S),FV4(IMP1S)
  18938.     CHARACTER*1 FVXX(IMPs3)
  18939.     EQUIVALENCE (FV1(1),FVXX(1)),(FV2(1),FVXX(Imp2s))
  18940.     EQUIVALENCE (FV4(1),FVXX(Imp3s))
  18941.         Common/FVLDM/FVXX
  18942. c        COMMON/FVLDM/FV1,FV2,FV4
  18943.         CHARACTER*1 LBITS(8)
  18944.         COMMON/BITS/LBITS
  18945. C THE FOLLOWING BITMAP IS FOR TYPE ARRAY, AND INTEGER ARRAY IS FOR
  18946. C TYPES OF AC'S STORAGE:
  18947.     LOGICAL*4 LB1,LB2
  18948.     InTeGer*4 KB1,KB2
  18949.     EQUIVALENCE(LB1,KB1),(LB2,KB2)
  18950.         CHARACTER*1 ITYP(IMP1S)
  18951.         InTeGer*4 IATYP(27),LINTGR
  18952.         COMMON/TYP/IATYP,ITYP,LINTGR
  18953. C ***<<< NULETC COMMON START >>>***
  18954.     InTeGer*4 ICREF,IRREF
  18955. C    COMMON/MIRROR/ICREF,IRREF
  18956.     InTeGer*4 MODPUB,LIMODE
  18957. C    COMMON/MODPUB/MODPUB,LIMODE
  18958.     InTeGer*4 KLKC,KLKR
  18959.     REAL*8 AACP,AACQ
  18960. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  18961.     InTeGer*4 NCEL,NXINI
  18962. C    COMMON/NCEL/NCEL,NXINI
  18963.     CHARACTER*1 NAMARY(20,MRows)
  18964. C    COMMON/NMNMNM/NAMARY
  18965.     InTeGer*4 NULAST,LFVD
  18966. C    COMMON/NULXXX/NULAST,LFVD
  18967.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  18968.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  18969. C ***<<< NULETC COMMON END >>>***
  18970. CCC    InTeGer*4 ICREF,IRREF
  18971. CCC    COMMON/MIRROR/ICREF,IRREF
  18972. C
  18973. C NEXT ARE BUFFERS FOR HOLDING VALUES, AND MEMORY OCCUPANCY WORDS
  18974. C FOR EACH GIVING THE BLK # IN USE FOR THESE TABLES
  18975. C FORMAT BLOCK (ONE ONLY, 512 BYTES, BUT ORGANIZED AS 76 FORMAT
  18976. C AREAS WITH DATA.
  18977. C ***<<< KLSTO COMMON START >>>***
  18978.     InTeGer*4 DLFG
  18979. C    COMMON/DLFG/DLFG
  18980.     InTeGer*4 KDRW,KDCL
  18981. C    COMMON/DOT/KDRW,KDCL
  18982.     InTeGer*4 DTRENA
  18983. C    COMMON/DTRCMN/DTRENA
  18984.     REAL*8 EP,PV,FV
  18985.     DIMENSION EP(20)
  18986.     INTEGER*4 KIRR
  18987. C    COMMON/ERNPER/EP,PV,FV,KIRR
  18988.     InTeGer*4 LASTOP
  18989. C    COMMON/ERROR/LASTOP
  18990.     CHARACTER*1 FMTDAT(9,76)
  18991. C    COMMON/FMTBFR/FMTDAT
  18992.     CHARACTER*1 EDNAM(16)
  18993. C    COMMON/EDNAM/EDNAM
  18994.     InTeGer*4 MFID(2),MFMOD(2)
  18995. C    COMMON/FRM/MFID,MFMOD
  18996.     InTeGer*4 JMVFG,JMVOLD
  18997. C    COMMON/FUBAR/JMVFG,JMVOLD
  18998.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  18999.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  19000. C ***<<< KLSTO COMMON END >>>***
  19001. CCC        CHARACTER*1 FMTDAT(9,76)
  19002. CCC        COMMON/FMTBFR/FMTDAT
  19003.         CHARACTER*1 ITST,ITST2
  19004.     LOGICAL*4 LTST,LTST2
  19005.     InTeGer*4 KTST,KTST2
  19006.     EQUIVALENCE(LTST,ITST),(LTST2,ITST2)
  19007.     EQUIVALENCE(KTST,ITST),(KTST2,ITST2)
  19008.         IF(ID1.LE.27.AND.ID2.LE.1)GOTO 1000
  19009.     IVAL=2
  19010.     IF(LINTGR.EQ.0)RETURN
  19011.     CALL FVLDGT(ID1,ID2,ITST)
  19012.     IF(ICHAR(ITST).EQ.0)GOTO 500
  19013. C        ID=(ID2-1)*60+ID1
  19014.     CALL REFLEC(ID2,ID1,ID)
  19015.         IBT=(ID-1)/8
  19016.     KB1=ID-1
  19017.     KB2=7
  19018.     LB1=LB1.AND.LB2
  19019.     IBIT=KB1+1
  19020. C        IBIT=((ID-1).AND.7)+1
  19021.     KTST=ICHAR(ITYP(IBT))
  19022.     KTST2=ICHAR(LBITS(IBIT))
  19023.     LTST=LTST.AND.LTST2
  19024. C        ITST=CHAR(ICHAR(ITYP(IBT)).AND.ICHAR(LBITS(IBIT)))
  19025. 500     IVAL=2
  19026.         IF(KTST.NE.0)IVAL=4
  19027.         RETURN
  19028. 1000    CONTINUE
  19029. C AN AC. RETURN FULL TYPE WORD
  19030.         IVAL=IATYP(ID1)
  19031.         RETURN
  19032.         END
  19033. c -h- typset.for    Fri Aug 22 13:35:58 1986    
  19034.         SUBROUTINE TYPSET(ID1,ID2,IVAL)
  19035. C
  19036. C TYPSET - STORE IVAL IN TYPE(60,301) ARRAY
  19037. C NEXT BITMAPS IMPLEMENT FVLD
  19038.     Include AParms.inc
  19039.         CHARACTER*1 FV1(IMP1S),FV2(IMP1S),FV4(IMP1S)
  19040.     CHARACTER*1 FVXX(Imps3)
  19041.     EQUIVALENCE (FV1(1),FVXX(1)),(FV2(1),FVXX(Imp2s))
  19042.     EQUIVALENCE (FV4(1),FVXX(Imp3s))
  19043.         Common/FVLDM/FVXX
  19044. c        COMMON/FVLDM/FV1,FV2,FV4
  19045.         CHARACTER*1 LBITS(8)
  19046.         COMMON/BITS/LBITS
  19047. C THE FOLLOWING BITMAP IS FOR TYPE ARRAY, AND INTEGER ARRAY IS FOR
  19048. C TYPES OF AC'S STORAGE:
  19049.     LOGICAL*4 LTST,LTST2,LTST3,LT1,LT2
  19050.     InTeGer*4 KTST,KTST2,KTST3,KT1,KT2
  19051.     EQUIVALENCE(LT1,KT1),(LT2,KT2)
  19052.         CHARACTER*1 ITYP(IMP1S)
  19053.         InTeGer*4 IATYP(27),LINTGR
  19054.         COMMON/TYP/IATYP,ITYP,LINTGR
  19055. C ***<<< NULETC COMMON START >>>***
  19056.     InTeGer*4 ICREF,IRREF
  19057. C    COMMON/MIRROR/ICREF,IRREF
  19058.     InTeGer*4 MODPUB,LIMODE
  19059. C    COMMON/MODPUB/MODPUB,LIMODE
  19060.     InTeGer*4 KLKC,KLKR
  19061.     REAL*8 AACP,AACQ
  19062. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  19063.     InTeGer*4 NCEL,NXINI
  19064. C    COMMON/NCEL/NCEL,NXINI
  19065.     CHARACTER*1 NAMARY(20,MRows)
  19066. C    COMMON/NMNMNM/NAMARY
  19067.     InTeGer*4 NULAST,LFVD
  19068. C    COMMON/NULXXX/NULAST,LFVD
  19069.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  19070.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  19071. C ***<<< NULETC COMMON END >>>***
  19072. CCC    InTeGer*4 ICREF,IRREF
  19073. CCC    COMMON/MIRROR/ICREF,IRREF
  19074. C
  19075. C NEXT ARE BUFFERS FOR HOLDING VALUES, AND MEMORY OCCUPANCY WORDS
  19076. C FOR EACH GIVING THE BLK # IN USE FOR THESE TABLES
  19077. C FORMAT BLOCK (ONE ONLY, 512 BYTES, BUT ORGANIZED AS 76 FORMAT
  19078. C AREAS WITH DATA.
  19079. C ***<<< KLSTO COMMON START >>>***
  19080.     InTeGer*4 DLFG
  19081. C    COMMON/DLFG/DLFG
  19082.     InTeGer*4 KDRW,KDCL
  19083. C    COMMON/DOT/KDRW,KDCL
  19084.     InTeGer*4 DTRENA
  19085. C    COMMON/DTRCMN/DTRENA
  19086.     REAL*8 EP,PV,FV
  19087.     DIMENSION EP(20)
  19088.     INTEGER*4 KIRR
  19089. C    COMMON/ERNPER/EP,PV,FV,KIRR
  19090.     InTeGer*4 LASTOP
  19091. C    COMMON/ERROR/LASTOP
  19092.     CHARACTER*1 FMTDAT(9,76)
  19093. C    COMMON/FMTBFR/FMTDAT
  19094.     CHARACTER*1 EDNAM(16)
  19095. C    COMMON/EDNAM/EDNAM
  19096.     InTeGer*4 MFID(2),MFMOD(2)
  19097. C    COMMON/FRM/MFID,MFMOD
  19098.     InTeGer*4 JMVFG,JMVOLD
  19099. C    COMMON/FUBAR/JMVFG,JMVOLD
  19100.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  19101.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  19102. C ***<<< KLSTO COMMON END >>>***
  19103. CCC        CHARACTER*1 FMTDAT(9,76)
  19104. CCC        COMMON/FMTBFR/FMTDAT
  19105.         CHARACTER*1 ITST,ITST2,ITST3
  19106.     EQUIVALENCE(LTST,ITST),(LTST2,ITST2)
  19107.     EQUIVALENCE(KTST,ITST),(KTST2,ITST2)
  19108.     EQUIVALENCE(KTST3,ITST3),(KTST3,LTST3)
  19109.     IF(ID2.EQ.1.AND.ID1.LE.27)GOTO 2000
  19110. C KEEP TRACK OF WHEN WE START TO SET INTEGER TYPE
  19111.     IF(LINTGR.EQ.0.AND.IABS(IVAL).EQ.2)RETURN
  19112. C FOR SIMPLICITY SET FLAG ON 1ST NONFLOATING TYPE AND
  19113. C START KEEPING EXACT TRACK THEN ONLY.
  19114.     LINTGR=1
  19115. C        ID=(ID2-1)*60+ID1
  19116.     CALL REFLEC(ID2,ID1,ID)
  19117.         IBT=(ID-1)/8
  19118.     KT1=ID-1
  19119.     KT2=7
  19120.     LT1=LT1.AND.LT2
  19121.     IBIT=KT1+1
  19122. C        IBIT=((ID-1).AND.7)+1
  19123.     KTST2=ICHAR(LBITS(IBIT))
  19124.     KTST3=KTST2
  19125.     LTST2=.NOT.LTST2
  19126. C        ITST2=.NOT.LBITS(IBIT)
  19127.     KTST=ICHAR(ITYP(IBT))
  19128.     LTST2=LTST.AND.LTST2
  19129. C        ITST2=ITYP(IBT).AND.ITST2
  19130.     LTST=LTST.OR.LTST3
  19131.     ITST=CHAR(KTST)
  19132.     ITST2=CHAR(KTST2)
  19133. C        ITST=ITYP(IBT).OR.LBITS(IBIT)
  19134.         ITYP(IBT)=ITST2
  19135.         IF(IVAL.NE.-2.AND.IVAL.NE.2)ITYP(IBT)=ITST
  19136.     RETURN
  19137. 2000    IATYP(ID1)=IVAL
  19138. C ACCUMULATORS JUST STORE NORMAL TYPE INTEGER.
  19139.         RETURN
  19140.         END
  19141. c -h- usrcmd.for    Fri Aug 22 13:36:30 1986    
  19142. c        interface to InTeGer*4 function system [c]
  19143. c     +          (string[reference])
  19144. c        character*1 string
  19145. c        end
  19146.     SUBROUTINE USRCMD(CMDLIN,ICODE,IGOTIT)
  19147. C --- FOR 320K AnalytiCalc only (to keep it able to fit on 256K
  19148. c     versions...)
  19149. c Add "annotation" commands via main force & awkwardness as follows:
  19150. c  1. ANN command will create a file named cell.ANN for the current
  19151. c     cell (or overwrite an old one) dynamically for up to 20 lines
  19152. c     of text, just firing up the command "EDIT namecell.ANN" so the user
  19153. c     gets to do full screen edits. THE "name" part of the files is
  19154. c     taken from the first 6 characters of the sheet name. If these
  19155. c     are not in the uppercase alpha range they will be ignored, however,
  19156. c     so it is a good idea for sheet titles to have recognizable initial
  19157. c     6 characters.
  19158. c  2. QUERY or ? command will display the name.ANN file if it exists
  19159. c     after setting cursor to top of screen and doing line erase
  19160. c     there.
  19161. c
  19162.     Include AParms.Inc
  19163.     CHARACTER*81 CMDSTR
  19164.     CHARACTER*1 CMLN(80),CMLN2(84)
  19165. C    PARAMETER CUP=1,EL=12,ED=11,SGR=13
  19166.     InTeGer*4 IJUNK
  19167. c    InTeGer*4 SYSTEM
  19168. c    EXTERNAL SYSTEM
  19169.     EQUIVALENCE(CMLN2(5),CMLN(1),CMDSTR(1:1))
  19170. C    EQUIVALENCE(CMLN2(5),CMLN(1))
  19171. C DUMMY PLACE FOR USER COMMANDS TO PARSE CMDLIN AND HANDLE
  19172. C DEFINE VALUE AREA FOR SPREAD SHEET. MORE WILL BE NEEDED GENERALLY
  19173. C OUT OF COMMONS, BUT AT A MINIMUM, THIS WILL ALLOW SOME ACCESS TO
  19174. C USEFUL NUMBERS. LOOK IN XQTCMD FOR MORE...
  19175.     CHARACTER*1 AVBLS(20,27),WRK(128),VBLS(8,1,1)
  19176.     InTeGer*4 TYPE(1,1),VLEN(9)
  19177.     LOGICAL*4 LEXIST
  19178.     CHARACTER*1 NMSH(80)
  19179.     COMMON/NMSH/NMSH
  19180. C ***<<<< RDD COMMON START >>>***
  19181.     InTeGer*4 RRWACT,RCLACT
  19182. C    COMMON/RCLACT/RRWACT,RCLACT
  19183.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  19184.      1  IDOL7,IDOL8
  19185. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  19186. C     1  IDOL7,IDOL8
  19187.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  19188. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  19189.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  19190. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  19191. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  19192. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  19193.     InTeGer*4 KLVL
  19194. C    COMMON/KLVL/KLVL
  19195.     InTeGer*4 IOLVL,IGOLD
  19196. C    COMMON/IOLVL/IOLVL
  19197. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  19198. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  19199.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  19200.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  19201.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  19202.      3  k3dfg,kcdelt,krdelt,kpag
  19203. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  19204. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  19205. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  19206. C ***<<< RDD COMMON END >>>***
  19207. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  19208. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  19209.     REAL*8 XAC,XVBLS(1,1)
  19210.     REAL*8 TAC,UAC,VAC
  19211.     INTEGER*4 JVBLS(2,1,1)
  19212.     EQUIVALENCE(XAC,AVBLS(1,27))
  19213.     EQUIVALENCE(TAC,AVBLS(1,20))
  19214.     EQUIVALENCE(UAC,AVBLS(1,21))
  19215.     EQUIVALENCE(VAC,AVBLS(1,22))
  19216.     EQUIVALENCE(VBLS(1,1,1),JVBLS(1,1,1))
  19217.     EQUIVALENCE(VBLS(1,1,1),XVBLS(1,1))
  19218.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  19219. C    CHARACTER*1 FORM(4)
  19220.     CHARACTER*1 CELNAM(5)
  19221.     character*18 annam
  19222.     CHARACTER*1 annams(18)
  19223.     equivalence(annam(1:1),annams(1))
  19224.     CHARACTER*5 CELNM
  19225.     CHARACTER*5 CELRW
  19226.     EQUIVALENCE(CELNM(1:1),CELRW(1:1),CELNAM(1))
  19227. C    EQUIVALENCE(FORM(1),CELNAM(1))
  19228. C    EQUIVALENCE(CELRW,CELNAM(1))
  19229. C ***<<< KLSTO COMMON START >>>***
  19230.     InTeGer*4 DLFG
  19231. C    COMMON/DLFG/DLFG
  19232.     InTeGer*4 KDRW,KDCL
  19233. C    COMMON/DOT/KDRW,KDCL
  19234.     InTeGer*4 DTRENA
  19235. C    COMMON/DTRCMN/DTRENA
  19236.     REAL*8 EP,PV,FV
  19237.     DIMENSION EP(20)
  19238.     INTEGER*4 KIRR
  19239. C    COMMON/ERNPER/EP,PV,FV,KIRR
  19240.     InTeGer*4 LASTOP
  19241. C    COMMON/ERROR/LASTOP
  19242.     CHARACTER*1 FMTDAT(9,76)
  19243. C    COMMON/FMTBFR/FMTDAT
  19244.     CHARACTER*1 EDNAM(16)
  19245. C    COMMON/EDNAM/EDNAM
  19246.     InTeGer*4 MFID(2),MFMOD(2)
  19247. C    COMMON/FRM/MFID,MFMOD
  19248.     InTeGer*4 JMVFG,JMVOLD
  19249. C    COMMON/FUBAR/JMVFG,JMVOLD
  19250.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  19251.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  19252. C ***<<< KLSTO COMMON END >>>***
  19253. CCC    CHARACTER*1 EDNAM(16)
  19254. CCC    common/ednam/ednam
  19255. c available parsing aid:
  19256. c call varscn(line,ibgn,lend,lstchr,id1,id2,ivalid)
  19257. c where line(ibgn... lend) is scanned. If variable found
  19258. c ivalid=1 else ivalid=0. id1,id2 are dims in xvbls for
  19259. c variable found if any. lstchr is last char found+1...
  19260. C OTHER USEFUL ROUTINES IN THE SHEET:
  19261. C GN(LAST,LEND,NUMBER,LINE)
  19262. C  LOOKS FROM LINE(LAST) THRU LINE(LEND) FOR A NUMBER AND
  19263. C  RETURNS ANY NUMBER IN "NUMBER" ARG. ASSUMES "LINE" IS A
  19264. C  BYTE ARRAY. (NO INDICATION OF WHERE THE NUMBER WAS FOUND
  19265. C  HOWEVER). THROWS OUT LEADING SPACES, TERMINATES ON A NON
  19266. C  NUMERIC.
  19267. C INDEX(LINE,CHAR)
  19268. C  EXPECTS LINE TO BE NULL TERMINATED AND RETURNS EITHER
  19269. C  THE SUBSCRIPT (COUNTING FROM 1) OF CHAR IN LINE OR THE
  19270. C  MAX SUBSCRIPT IN LINE (I.E., WHERE IT HIT THE NULL TERMINATOR).
  19271. C  NOTE THIS DIFFERS FROM THE "STANDARD" VERSION OF INDEX WHICH
  19272. C  RETURNS 0 FOR "NOT FOUND" -- THIS VERSION RETURNS MAX LENGTH
  19273. C  FOR "NOT FOUND". STOPS AT 512 BYTES HOWEVER...
  19274. C  PARSING IS UP TO USER. NOTE VARSCN MAY BE CALLED TO PARSE
  19275.     CHARACTER*1 CMDLIN(132)
  19276. C    INTEGER*4 ISTTS
  19277. C
  19278. C 16 MUST BE LENGTH OF EDNAM IN BYTES
  19279. C KEEP NAME "EDIT " IN DATA SO IT CAN BE BASHED IF NEEDED TO BE...
  19280. C INSERT CODE FOR ADDING A LIB$SPAWN CALL HERE TO PASS COMMANDS TO
  19281. C 75 IF THEY BEGIN WITH A $ CHARACTER.
  19282.     IGOTIT=0
  19283.     IF(CMDLIN(1).NE.'}'.AND.CMDLIN(1).NE.'$')GOTO 8990
  19284. C
  19285. CC HERE CALL EXECIT WITH THE COMMAND LINE AS AN ARGUMENT...
  19286.     DO 1000 NN=1,80
  19287. 1000    CMLN(NN)=CMDLIN(NN+1)
  19288.     CMLN(79)=Char(13)
  19289.     CMLN(80)=Char(0)
  19290.     DO 1002 NN=1,77
  19291.     N=78-NN
  19292.     IF(ICHAR(CMLN(N)).GT.32)GOTO 1004
  19293. 1002    CONTINUE
  19294. C FINDING END OF REAL STRING THIS WAY
  19295. 1004    CONTINUE
  19296.     CMLN(N+1)=0
  19297. c was =13, not =0 above...
  19298. C ADD C.R., THEN NULL
  19299.     CMLN(N+2)=0
  19300.     CMLN(N+3)=0
  19301. C INSERT LENGTH COUNT AS 1ST BYTE OF CMD LENGTH
  19302. C PER DOS 2.0 MANUAL PG F-1
  19303. ccc    CMLN2(1)=CHAR(N+3)
  19304. ccc    CMLN2(2)='/'
  19305. ccc    CMLN2(3)='C'
  19306. ccc    CMLN2(4)=' '
  19307. CC ! ADD C.R. AFTER LINE
  19308. CC ABOVE, INSERT A CR AFTER CMD LINE
  19309. C USE SYSTEM CALL INSTEAD OF OLDER CALL WHICH USES NOW-UNSUPPORTED
  19310. C FORTRAN FEATURES IN MS-FORTRAN V3.3
  19311.     call system(cmln2(5))
  19312. c    N=SYSTEM(CMLN2(5))
  19313. ccc    CALL EXECIT(CMLN2)
  19314. C ASSUME WE NEED A REDRAW AFTER THE SPAWN FINISHES
  19315. C EVENTUALLY FIGURE OUT HOW TO EXEC A ROUTINE THIS WAY, BUT JUST DUMMY OUT
  19316. C  AT FIRST.
  19317.     IF(CMDLIN(1).NE.'}')GOTO 2300
  19318. C IMPLEMENT WAIT ON } FORM...
  19319.     CALL UVT100(1,25,1)
  19320.     CALL VWRT('Push Return key to return to sheet>',35)
  19321.     call vget(ijunk,2)
  19322. c    READ(11,2400,END=2300,ERR=2300)IJUNK
  19323. 2400    FORMAT(2A1)
  19324. 2300    CONTINUE
  19325.     ICODE=2
  19326. C FLAG THE MAIN COMMAND PARSER WE HANDLED THE COMMAND
  19327.     IGOTIT=1
  19328. 8990    CONTINUE
  19329.     IF(CMDLIN(1).NE.'F'.OR.
  19330.      1     CMDLIN(2).NE.'I'.OR.
  19331.      2     CMDLIN(3).NE.'L') GOTO 9000
  19332.     IGOTIT=1
  19333.     ICODE=3
  19334.     CALL DTRCMD(CMDLIN(4))
  19335. C ALLOW EXTRA COMMANDS OUT OF VAX VERSION...
  19336. C
  19337. 9000    CONTINUE
  19338.     IF(CMDLIN(1).NE.'A'.OR.CMDLIN(2).NE.'N')GOTO 9200
  19339. C ANNOTATE COMMAND SEEN
  19340.     IGOTIT=1
  19341.     ICODE=2
  19342.     DO 9001 N=1,80
  19343.     CMLN(N)=Char(32)
  19344. 9001    CONTINUE
  19345. C    CALL IN2AS(PROW,FORM)
  19346.     CALL REFLEC(PCOL,PROW,IRX)
  19347.     WRITE(CELRW(1:5),9002)IRX
  19348. 9002    FORMAT(I5.5)
  19349.     ICM=17
  19350.     DO 9040 N=1,3
  19351.     IXX=ICHAR(NMSH(N))
  19352.     IF(IXX.GT.96)IXX=IXX-32
  19353.     IF(IXX.LT.65.OR.IXX.GT.90)GOTO 9040
  19354.     CMLN(ICM)=CHAR(IXX)
  19355.     ICM=ICM+1
  19356. 9040    CONTINUE
  19357.     ICM=ICM-1
  19358.     DO 9003 N=1,5
  19359.     CMLN(N+ICM)=CELNAM(N)
  19360. 9003    CONTINUE
  19361.     CMLN(ICM+6)='.'
  19362.     CMLN(ICM+7)='A'
  19363.     CMLN(ICM+8)='N'
  19364.     CMLN(ICM+9)='N'
  19365.     CMLN(ICM+10)=' '
  19366.     CMLN(80)=13
  19367.     DO 9008 N=1,16
  19368.     CMLN(N)=EDNAM(N)
  19369. 9008    CONTINUE
  19370. C NOW HAVE "EDIT name.ANN"
  19371. c built... go fire it up for creation or modification of annotation...
  19372.     DO 9150 N=17,ICM+9
  19373.     IF(CMLN(N).EQ.' ')CMLN(N)='0'
  19374. 9150    CONTINUE
  19375.     DO 9162 NN=1,77
  19376.     N=78-NN
  19377.     IF(ICHAR(CMLN(N)).GT.32)GOTO 9164
  19378. 9162    CONTINUE
  19379. C FINDING END OF REAL STRING THIS WAY
  19380. 9164    CONTINUE
  19381.     CMLN(N+1)=Char(13)
  19382. C ADD C.R., THEN NULL
  19383.     CMLN(N+2)=Char(0)
  19384.     CMLN(N+3)=Char(0)
  19385.     N=SYSTEM(CMLN2(5))
  19386.     GOTO 9990
  19387. 9200    CONTINUE
  19388.     IF(CMDLIN(1).NE.'?'.AND.(CMDLIN(1).NE.'Q'.OR.CMDLIN(2)
  19389.      1  .NE.'U'.OR.CMDLIN(3).NE.'E')) GOTO 9300
  19390. C QUERY COMMAND SEEN
  19391.     IGOTIT=1
  19392.     ICODE=2
  19393.     DO 9237 N=1,18
  19394. 9237    ANNAMS(N)=CHAR(32)
  19395.     CALL REFLEC(PCOL,PROW,IRX)
  19396.     WRITE(CELRW(1:5),9002)IRX
  19397.     ICM=0
  19398.     do 9238 n=1,18
  19399.     annams(n)=char(32)
  19400. 9238    continue
  19401.     DO 9240 N=1,3
  19402. C NOTE ANNOTATION NAMES ARE DIFFERENT HERE FROM VAX...
  19403. C USE NAMnnnnn.ANN WHERE nnnnn IS CELL HASH AND "NAM" COMES
  19404. C FROM 1ST 3 CHARS OF SHEET TITLE.
  19405.     IXX=ICHAR(NMSH(N))
  19406.     IF(IXX.GT.96)IXX=IXX-32
  19407.     IF(IXX.LT.65.OR.IXX.GT.90)GOTO 9240
  19408.     ICM=ICM+1
  19409.     ANNAMS(ICM)=CHAR(IXX)
  19410. 9240    CONTINUE
  19411.     DO 9241 N=1,5
  19412.     ANNAMS(ICM+N)=CELNAM(N)
  19413. 9241    CONTINUE
  19414.     ANNAMS(ICM+6)='.'
  19415.     ANNAMS(ICM+7)='A'
  19416.     ANNAMS(ICM+8)='N'
  19417.     ANNAMS(ICM+9)='N'
  19418.     DO 9250 N=1,18
  19419.     IF(ANNAMS(N).EQ.' ')ANNAMS(N)='0'
  19420. 9250    CONTINUE
  19421.     ANNAMS(ICM+10)=' '
  19422. C GO TO 9210 IF NO FILE
  19423.     INQUIRE (FILE=ANNAM,EXIST=LEXIST)
  19424.     IF(.NOT.LEXIST)GOTO 9210
  19425.     OPEN(UNIT=2,FILE=ANNAM,ACCESS='SEQUENTIAL',STATUS='OLD')
  19426.     DO 9030 N=1,20
  19427.     READ(2,9031,END=9032,ERR=9032)WRK
  19428. 9031    FORMAT(128A1)
  19429.     CALL UVT100(1,N+2,1)
  19430.     CALL UVT100(12,2,0)
  19431.     call swrt(wrk,79)
  19432. c    WRITE(6,9035)WRK
  19433. 9035    FORMAT(128A1)
  19434. 9030    CONTINUE
  19435. 9032    CONTINUE
  19436. C THIS DISPLAYS ALL THE ANNOTATION WE HAVE...
  19437.     CLOSE(UNIT=2)
  19438.     CALL UVT100(1,LLCMD,1)
  19439.     CALL UVT100(12,2,0)
  19440.     CALL VWRT('Push Return key to return to sheet>',35)
  19441.     call vget(ijunk,2)
  19442. c    READ(11,2400,END=9990,ERR=9990)IJUNK
  19443.     GOTO 9990
  19444. 9210    CONTINUE
  19445.     ICODE=3
  19446.     CALL UVT100(1,LLDSP,1)
  19447.     call uvt100(12,2,0)
  19448.     CALL SWRT('No Annotation found on thic cell.',33)
  19449. c    WRITE(6,9211)
  19450. c9211    FORMAT(' No annotation found on this cell.')
  19451. 9300    CONTINUE
  19452. C
  19453. 9990    CONTINUE
  19454.     RETURN
  19455.     END
  19456. c -h- usrfct.for    Fri Aug 22 13:36:30 1986    
  19457. C USER FUNCTION ROUTINE
  19458. C GENERATES PARSING AND EXECUTION OF ROUTINE CALLS OF FORM
  19459. C  *U FNAME (ARGUMENTS)
  19460. C WHERE LINE (80 BYTES) CONTAINS COMMAND LINE AND ALL
  19461. C ARGUMENTS MAY BE PARSED.
  19462. C CALLED FROM CMND
  19463. C
  19464. C VAX VERSION: MOST MATRIX ROUTINES AVAILABLE
  19465. C BUT ASSUMES SUBSTANTIAL SPACE AVAILABLE.
  19466. C
  19467. c available parsing aid:
  19468. c call varscn(line,ibgn,lend,lstchr,id1,id2,ivalid)
  19469. c where line(ibgn... lend) is scanned. If variable found
  19470. c ivalid=1 else ivalid=0. id1,id2 are dims in xvbls for
  19471. c variable found if any. lstchr is last char found+1...
  19472. C OTHER USEFUL ROUTINES IN THE SHEET:
  19473. C GN(LAST,LEND,NUMBER,LINE)
  19474. C  LOOKS FROM LINE(LAST) THRU LINE(LEND) FOR A NUMBER AND
  19475. C  RETURNS ANY NUMBER IN "NUMBER" ARG. ASSUMES "LINE" IS A
  19476. C  BYTE ARRAY. (NO INDICATION OF WHERE THE NUMBER WAS FOUND
  19477. C  HOWEVER). THROWS OUT LEADING SPACES, TERMINATES ON A NON
  19478. C  NUMERIC.
  19479. C INDEX(LINE,CHAR)
  19480. C  EXPECTS LINE TO BE NULL TERMINATED AND RETURNS EITHER
  19481. C  THE SUBSCRIPT (COUNTING FROM 1) OF CHAR IN LINE OR THE
  19482. C  MAX SUBSCRIPT IN LINE (I.E., WHERE IT HIT THE NULL TERMINATOR).
  19483. C  NOTE THIS DIFFERS FROM THE "STANDARD" VERSION OF INDEX WHICH
  19484. C  RETURNS 0 FOR "NOT FOUND" -- THIS VERSION RETURNS MAX LENGTH
  19485. C  FOR "NOT FOUND". STOPS AT 512 BYTES HOWEVER...
  19486. C  PARSING IS UP TO USER. NOTE VARSCN MAY BE CALLED TO PARSE
  19487. C VARIABLE NAMES. SUPPLIED VERSION CALLS IDATE WHICH RETURNS
  19488. C SYSTEM DATE IN RSX OR VMS AS INTEGER DAY, MONTH, AND YEAR.
  19489. C  THIS RETURNS HERE IN AC T, U, AND V
  19490. C
  19491.     SUBROUTINE USRFCT(LINE,RETCD,WRK2)
  19492.     Include AParms.inc
  19493.     CHARACTER*1 LINE(80)
  19494.     INTEGER RETCD
  19495.     CHARACTER*1 AVBLS(20,27),WRK(128),VBLS(8,1,1)
  19496.     CHARACTER*1 WRK2(128)
  19497.     InTeGer*4 TYPE(1,1),VLEN(9)
  19498.     EXTERNAL INDX
  19499.     REAL*8 XAC,XVBLS(1,1)
  19500.     REAL*8 TAC,UAC,VAC,WAC,YAC
  19501.     REAL*8 TMP,XXXX
  19502.     INTEGER*4 JVBLS(2,1,1)
  19503.     EQUIVALENCE(WAC,AVBLS(1,23)),(YAC,AVBLS(1,25))
  19504.     EQUIVALENCE(XAC,AVBLS(1,27))
  19505.     EQUIVALENCE(TAC,AVBLS(1,20))
  19506.     EQUIVALENCE(UAC,AVBLS(1,21))
  19507.     EQUIVALENCE(VAC,AVBLS(1,22))
  19508.     EQUIVALENCE(VBLS(1,1,1),JVBLS(1,1,1))
  19509.     EQUIVALENCE(VBLS(1,1,1),XVBLS(1,1))
  19510.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  19511. CCC    InTeGer*4 XTNCNT,XTCFG,IPSET
  19512. CCC    CHARACTER*1 XTNCMD(80)
  19513. CCC    InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  19514. C ***<<<< RDD COMMON START >>>***
  19515.     InTeGer*4 RRWACT,RCLACT
  19516. C    COMMON/RCLACT/RRWACT,RCLACT
  19517.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  19518.      1  IDOL7,IDOL8
  19519. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  19520. C     1  IDOL7,IDOL8
  19521.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  19522. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  19523.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  19524. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  19525. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  19526. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  19527.     InTeGer*4 KLVL
  19528. C    COMMON/KLVL/KLVL
  19529.     InTeGer*4 IOLVL,IGOLD
  19530. C    COMMON/IOLVL/IOLVL
  19531. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  19532. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  19533.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  19534.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  19535.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  19536.      3  k3dfg,kcdelt,krdelt,kpag
  19537. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  19538. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  19539. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  19540. C ***<<< RDD COMMON END >>>***
  19541. CCC    InTeGer*4 IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  19542. CCC    COMMON/DOLLR/IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  19543. CCC    InTeGer*4 RRWACT,RCLACT
  19544. CCC    COMMON/RCLACT/RRWACT,RCLACT
  19545. C ***<<< XVXTCD COMMON START >>>***
  19546.     CHARACTER*1 OARRY(100)
  19547.     InTeGer*4 OSWIT,OCNTR
  19548. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  19549. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  19550.     InTeGer*4 IPS1,IPS2,MODFLG
  19551. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  19552.        InTeGer*4 XTCFG,IPSET,XTNCNT
  19553.        CHARACTER*1 XTNCMD(80)
  19554. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  19555. C VARY FLAG ITERATION COUNT
  19556.     INTEGER KALKIT
  19557. C    COMMON/VARYIT/KALKIT
  19558.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  19559.     InTeGer*4 RCMODE,IRCE1,IRCE2
  19560.  
  19561. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  19562. C     1  IRCE2
  19563. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  19564. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  19565. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  19566. C RCFGX ON.
  19567. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  19568. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  19569. C  AND VM INHIBITS. (SETS TO 1).
  19570.     INTEGER*4 FH
  19571. C FILE HANDLE FOR CONSOLE I/O (RAW)
  19572. C    COMMON/CONSFH/FH
  19573.     CHARACTER*1 ARGSTR(52,4)
  19574. C    COMMON/ARGSTR/ARGSTR
  19575.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  19576.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  19577.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  19578.      3  IRCE2,FH,ARGSTR
  19579. C ***<<< XVXTCD COMMON END >>>***
  19580. CCC    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE
  19581. CCC    COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  19582. C LOOP CONTROL FOR VARY FUNCTION. SET ZERO IN SPREDSHT AND
  19583. C MUST BE SET POSITIVE HERE IF WE NEED ITERATIONS.
  19584. C (IMPLEMENT FOR VAX ONLY)
  19585. CCC    INTEGER KALKIT
  19586. CCC    COMMON/VARYIT/KALKIT
  19587. C ARGUMENTS COME IN IN ARGUMENTS IN LINE
  19588. C RESULTS GO INTO PERCENT (XAC) AND WHEREVER ELSE DESIRED...
  19589. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  19590. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  19591.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  19592.     COMMON/D2R/NRDSP,NCDSP
  19593.     CHARACTER*1 FNAMS(6,24)
  19594. C FNAMS IS NAME OF FUNCTION CALLED.
  19595.     DATA FNAMS /'I','D','A','T','E','0',
  19596.      1  'M','T','X','E','Q','0',
  19597.      2  'M','O','V','E','V','0',
  19598.      3  'M','D','E','T','0','0',
  19599.      4  'M','P','R','O','D','0',
  19600.      5  'M','A','D','D','V','0','M','S','U','B','V','0',
  19601.      7  'M','M','P','Y','T','0','M','M','P','Y','C','0',
  19602.      9  'V','A','R','Y','0','0','X','Q','T','C','M','0',
  19603.      2  'S','T','R','V','L','0','H','E','R','E','0','0',
  19604.      4  'Y','R','M','O','D','0','J','D','A','T','E','0',
  19605.      6  'J','T','O','C','H','0','D','A','T','E','0','0',
  19606.      1  'W','K','D','Y','S','0','W','K','D','I','N','0',
  19607.      2  'F','F','T','F','W','0','F','F','T','R','V','0',
  19608.      3  'L','I','N','E','F','0','D','B','0','0','0','0',
  19609.      4  'S','T','0','0','0','0'/
  19610. C NULL TERMINATE ANY NAMES (ALLOWS 5 CHARACTERS)
  19611. C START LOOKING PAST THE *U
  19612. C  GET FUNCTION NAME AND GO TO PROCESS EACH FUNCTION SEPARATELY
  19613. C GET NONBLANK CHAR FOR FUNCTION NAME START
  19614. C NO-OP THE XQTCM FUNCTION FOR PDP11-OVERLAIN VERSIONS BY ZAPPING
  19615. C THE NAME SO IT CAN'T EVER BE CALLED.
  19616.     K=3
  19617. 30    IF(LINE(K).NE.' ')GOTO 40
  19618.     K=K+1
  19619.     IF(K.LT.60)GOTO 30
  19620. 40    CONTINUE
  19621. C UNCOMMENT THE DO 100 STMT IF DIM 2 OF FNAMS > 1
  19622.     N=1
  19623. C **** BE SURE THE 2ND BOUND ON N IS THE SAME AS THE DIMENSION OF
  19624. C ****  FNAMS   **************************
  19625. C    DO 7771 N=1,24
  19626. C    DO 7771 NN=1,6
  19627. C    IF(FNAMS(NN,N).EQ.'0')FNAMS(NN,N)=0
  19628. C7771    CONTINUE
  19629.     DO 100 N=1,24
  19630.     KF=N
  19631.     DO 110 NN=1,6
  19632. C CHECK FOR '0' IN FUNCTION NAME AND SKIP ON THAT... 48 IS ASCII /0/
  19633.     IF(LINE(K+NN-1).NE.FNAMS(NN,N).AND.ICHAR(FNAMS(NN,N)).NE.48)
  19634.      1  GOTO 100
  19635. 110    CONTINUE
  19636.     GOTO 200
  19637. 100    CONTINUE
  19638. C UNRECOGNIZED FUNCTION... IGNORE
  19639. 300    RETCD=3
  19640.     RETURN
  19641. 200    CONTINUE
  19642. C NOW HAVE FOUND FUNCTION IDENTIFIED BY KF. CALL IT AND ALLOW TO WORK
  19643.     GOTO (1100,1200,1300,1400,1500,1600,1700,1800,
  19644.      1  1900,2000,2100,2200,2300,2400,2500,2600,2700,
  19645.      2  2900,3000,3100,3200,3300,3400,3500),KF
  19646.     GOTO 300
  19647. 1100    CONTINUE
  19648. C IDATE FUNCTION
  19649. C RETURNS MONTH, DAY, YEAR IN AC'S T,U,V
  19650. C RETURN 4/1/85 (APRIL FOOLS DAY)
  19651. C    IDA=1
  19652. C    IMO=4
  19653. C    IYR=85
  19654. C    CALL IDATE(IMO,IDA,IYR)
  19655.     CALL DATE(IYR,IMO,IDA)
  19656. C CALL supplied GET-DATE FUNCTION AND HOPE IT'S OK
  19657.     TAC=IMO
  19658.     UAC=IDA
  19659.     IYR=IYR-1900
  19660.     VAC=IYR
  19661. C RETURN A FLOATING VALUE OF DATE FORM AS YYMMDD SO IT CAN BE
  19662. C USED FOR SORTING AND SIMILAR APPLICATIONS. COULD BE USED ALSO
  19663. C FOR INTERVALS IF A JULIAN DATE WERE RETURNED, BUT THIS WILL DO
  19664. C FOR COMPARISONS AND ORDERING.
  19665.     XAC=JULMDY(IYR,IMO,IDA)
  19666. C    XAC=VAC*10000.+TAC*100.+UAC
  19667.     RETURN
  19668. 1200    CONTINUE
  19669. C MATRIX EQUATION. NOTE WE MUST NOW START SCAN FOR ARGUMENTS...
  19670. C K+5 IS START OF ARG LIST. START AT K+6 TO ALLOW ( TO BE THERE...
  19671. C FORMAT DESIRED:
  19672. C  *U MTXEQ(A1:A2,X1:X2,B1:B2) GENERATING SOLUTION MATRIX X1:X2
  19673. C  FROM MATRICES A,B AND SOLVING EQUATION AX=B WHERE A IS AN N BY
  19674. C  N SQUARE MATRIX, AND X AND B ARE N BY M MATRICES.
  19675.     RETCD=1
  19676. C COLLECT ARGUMENTS. NOTE THAT VARSCN AND GN TRASH POINTERS PASSED
  19677. C TO THEM IN IBGN, LEND, SO MAKE UP EVERY TIME. USE VARSCN TO
  19678. C COLLECT POINTERS TO THE SHEET ARRAY FIRST OFF COMMAND LINE,
  19679. C THEN PROCESS IN OUR MAGICAL MYSTICAL ROUTINE...
  19680.     IBGN=K+6
  19681.     LEND=IBGN+20
  19682. C GET LOCATIONS OF MATRICES A, X, AND B (FOR AX=B EQN)
  19683. C A MUST BER N BY N, SQUARE. X,B ARE N BY M.
  19684.     CALL PMTX2(RETCD,3,LINE,IBGN,ID1A,ID2A,ID1B,ID2B,
  19685.      1   IDXA,IDXB,IDYA,IDYB,IDBA,IDBB,IDCA,IDCB)
  19686.     N=IABS(ID1B-ID1A)+1
  19687. C CHECK THAT MATRIX A IS SQUARE
  19688.     IF(N.NE.(IABS(ID2B-ID2A)+1))GOTO 300
  19689. C CHECK THAT MATRIX X AND B HAVE THE SAME DIMENSIONS
  19690.     IF((IDYA-IDXA).NE.(IDCA-IDBA))GOTO 300
  19691.     IF((IDYB-IDXB).NE.(IDCB-IDBB))GOTO 300
  19692.     M=IABS(IDYA-IDXA)+1
  19693. C CHECK THAT THE X AND B MATRIX DIMENSIONS ARE N BY M
  19694. C WHERE THE N IS THE SAME AS FOR THE A MATRIX
  19695.     NN=IABS(IDYB-IDXB)+1
  19696.     IF(NN.NE.N)GOTO 300
  19697. C NOW HAVE DIMENSIONS FOR ALL THIS STUFF...
  19698. C SINCE MTXEQU TRASHES ITS' B MATRIX, COPY IT INTO X MATRIX
  19699. C AND THEN CALL...
  19700.     DO 1210 NN=IDBA,IDCA
  19701.     DO 1210 MM=IDBB,IDCB
  19702.     CALL XVBLGT(NN,MM,XVBLS(1,1))
  19703.     CALL XVBLST(NN-IDBA+IDXA,MM-IDBB+IDXB,XVBLS(1,1))
  19704. C    XVBLS(NN-IDBA+IDXA,MM-IDBB+IDXB)=XVBLS(NN,MM)
  19705. 1210    CONTINUE
  19706. C NOW ALL THE ARGUMENTS ARE SET UP... GO DO THE WORK.
  19707. C CALL UTILITY ROUTINE, THEN DONE...
  19708.     CALL MTXEQU(ID1A,ID2A,IDXA,IDXB,N,M,XAC)
  19709.     RETURN
  19710. 1300    CONTINUE
  19711. C MOVEV  MTX1 MTX2  MOVE MTX1 VALUES TO MTX2
  19712.     RETCD=1
  19713.     IBGN=K+6
  19714.     CALL PMTX2(RETCD,2,LINE,IBGN,IR1T,IC1T,IR1B,IC1B,IR2T,IC2T,
  19715.      1  IR2B,IC2B,KK,KK,KK,KK)
  19716. C CHECK FOR SAME SIZE MATRICES
  19717.     IF((IC1T-IC1B).NE.(IC2T-IC2B))GOTO 300
  19718.     IF((IR1T-IR1B).NE.(IR2T-IR2B))GOTO 300
  19719. C DO THE COPY HERE (EASIER THAN CALLING SOMETHING...)
  19720.     DO 1301 NN=IR1T,IR1B
  19721.     DO 1301 MM=IC1T,IC1B
  19722.     CALL XVBLGT(NN,MM,XVBLS(1,1))
  19723.     CALL XVBLST(NN-IR1T+IR2T,MM-IC1T+IC2T,XVBLS(1,1))
  19724. C    XVBLS(NN-IR1T+IR2T,MM-IC1T+IC2T)=XVBLS(NN,MM)
  19725. 1301    CONTINUE
  19726.     RETURN
  19727. 1400    CONTINUE
  19728. C MDET  - DETERMINANT OF SQUARE MATRIX
  19729. C  1 ARGUMENT, VIZ., MATRIX COORDS
  19730.     RETCD=1
  19731. C ACCOUNT FOR "MDET" BEING 4 CHARS NOT 5
  19732.     IBGN=K+5
  19733.     CALL PMTX2(RETCD,1,LINE,IBGN,IR1T,IC1T,IR1B,IC1B,
  19734.      1  IV,IV,IV,IV,IV,IV,IV,IV)
  19735. C CALL A DETERMINANT ROUTINE TO DO THE WORK
  19736. C NOTE IT CHECKS FOR SQUARE MATRIX INTERNALLY AND RETURNS 0 IF NOT
  19737. C SQUARE...
  19738.     CALL MDET(XVBLS,IR1T,IC1T,IR1B,IC1B,XAC)
  19739.     RETURN
  19740. 1500    CONTINUE
  19741. C MPROD A,B,C  C=A*B MATRIX WISE
  19742.     IBGN=K+6
  19743.     RETCD=1
  19744.     IMXX=3
  19745.     CALL PMTX2(RETCD,IMXX,LINE,IBGN,ID1A,ID2A,ID1B,ID2B,
  19746.      1  IDXA,IDXB,IDYA,IDYB,IDBA,IDBB,IDCA,IDCB)
  19747. C A=N BY M
  19748. C B=M BY L
  19749. C C=N BY L
  19750.     N=1+ID1B-ID1A
  19751.     M=1+ID2B-ID2A
  19752. C    IF(M.NE.(1+IDYB-IDXB))GOTO 300
  19753.     L=1+IDYA-IDXA
  19754. C    IF(N.NE.(1+IDCB-IDBB))GOTO 300
  19755. C    IF(L.NE.(1+IDCA-IDBA))GOTO 300
  19756. C DIMENSIONS LOOK OK NOW SO DO THE WORK
  19757. C USE SLIGHTLY MODIFIED GMPRD
  19758.     CALL GMPRD(ID1A,ID2A,IDXA,IDXB,
  19759.      1  IDBA,IDBB,N,M,L)
  19760.     RETURN
  19761. 1600    CONTINUE
  19762. C MADDV A,B,C  C=A+B
  19763.     IMXX=3
  19764.     IBGN=K+6
  19765.     RETCD=1
  19766.     CALL PMTX2(RETCD,IMXX,LINE,IBGN,ID1A,ID2A,ID1B,ID2B,
  19767.      1  IDXA,IDXB,IDYA,IDYB,IDBA,IDBB,IDCA,IDCB)
  19768.     N=1+ID1B-ID1A
  19769.     M=1+ID2B-ID2A
  19770. C    IF(N.NE.(1+IDYA-IDXA))GOTO 300
  19771. C    IF(N.NE.(1+IDCA-IDBA))GOTO 300
  19772. C    IF(M.NE.(1+IDYB-IDXB))GOTO 300
  19773. C    IF(M.NE.(1+IDCB-IDBB))GOTO 300
  19774. C USE MODIFIED GMADD
  19775.     CALL GMADD(ID1A,ID2A,IDXA,IDXB,
  19776.      1  IDBA,IDBB,M,N)
  19777.     RETURN
  19778. 1700    CONTINUE
  19779. C MSUBV A,B,C  C=A-B
  19780.     IMXX=3
  19781.     IBGN=K+6
  19782.     RETCD=1
  19783.     CALL PMTX2(RETCD,IMXX,LINE,IBGN,ID1A,ID2A,ID1B,ID2B,
  19784.      1  IDXA,IDXB,IDYA,IDYB,IDBA,IDBB,IDCA,IDCB)
  19785.     N=1+ID1B-ID1A
  19786.     M=1+ID2B-ID2A
  19787. C    IF(N.NE.(1+IDYA-IDXA))GOTO 300
  19788. C    IF(N.NE.(1+IDCA-IDBA))GOTO 300
  19789. C    IF(M.NE.(1+IDYB-IDXB))GOTO 300
  19790. C    IF(M.NE.(1+IDCB-IDBB))GOTO 300
  19791.     CALL GMSUB(ID1A,ID2A,IDXA,IDXB,
  19792.      1  IDBA,IDBB,M,N)
  19793.     RETURN
  19794. 1800    CONTINUE
  19795. C MMPYT A,B,C  C=AT*B
  19796. C GET 3 MATRICES
  19797.     IMXX=3
  19798.     IBGN=K+6
  19799.     RETCD=1
  19800.     CALL PMTX2(RETCD,IMXX,LINE,IBGN,ID1A,ID2A,ID1B,ID2B,
  19801.      1  IDXA,IDXB,IDYA,IDYB,IDBA,IDBB,IDCA,IDCB)
  19802. C TRANSPOSE DIMENSIONS OF A...
  19803.     M=1+ID1B-ID1A
  19804.     N=1+ID2B-ID2A
  19805. C    IF(M.NE.(1+IDYB-IDXB))GOTO 300
  19806.     L=1+IDYA-IDXA
  19807. C    IF(N.NE.(1+IDCB-IDBB))GOTO 300
  19808. C    IF(L.NE.(1+IDCA-IDBA))GOTO 300
  19809.     CALL GTPRD(ID1A,ID2A,IDXA,IDXB,
  19810.      1  IDBA,IDBB,N,M,L)
  19811.     RETURN
  19812. 1900    CONTINUE
  19813. C MMPYC A,B,K  B=A*K (K=CONSTANT)
  19814. C FOR MPY BY CONSTANT WE GET MATRICES IN ORDER A,C, THEN AC WITH CONST
  19815. C IN IT LAST...
  19816.     IBGN=K+6
  19817.     RETCD=1
  19818.     IMXX=2
  19819.     CALL PMTX2(RETCD,IMXX,LINE,IBGN,ID1A,ID2A,ID1B,ID2B,
  19820.      1  IDXA,IDXB,IDYA,IDYB,IDBA,IDBB,IDCA,IDCB)
  19821.     IF(LINE(IBGN-1).NE.',')GOTO 300
  19822.     LEND=IBGN+20
  19823.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,IDCA,IDCB,IVALID)
  19824.     IF(IVALID.EQ.0)GOTO 300
  19825. C NOW HAVE EVERYTHING OF ARGS... CHECK DIMENSIONS OF MATRICES....
  19826.     N=1+ID1B-ID1A
  19827.     M=1+ID2B-ID2A
  19828. C    IF(N.NE.(1+IDYA-IDXA))GOTO 300
  19829. C    IF(M.NE.(1+IDYB-IDXB))GOTO 300
  19830.     CALL XVBLGT(IDCA,IDCB,XXXX)
  19831.     DO 1901 NN=ID1A,ID1B
  19832.     DO 1901 MM=ID2A,ID2B
  19833.     CALL XVBLGT(NN,MM,XVBLS(1,1))
  19834.     XVBLS(1,1)=XVBLS(1,1)*XXXX
  19835.     CALL XVBLST(NN-ID1A+IDXA,MM-ID2A+IDXB,XVBLS(1,1))
  19836. C    XVBLS(NN-ID1A+IDXA,MM-ID2A+IDXB)=XVBLS(NN,MM)
  19837. C     1    *XVBLS(IDCA,IDCB)
  19838. 1901    CONTINUE
  19839.     RETURN
  19840. C *U VARY X,A,W,I,P;Q;R;S;T
  19841. C  REPEATEDLY COMPUTE SHEET FOR I ITERATIONS (DEFAULTS TO 1
  19842. C  IF NONE GIVEN) AND VARY AC P,Q,R,S, T (POSITIONAL...WHATEVER
  19843. C  IS NAMED) UNTIL CONDITION THAT AC X (WHATEVER IS NAMED THERE)
  19844. C  IS MADE EQUAL TO AC A AS CLOSELY AS POSSIBLE. DOES MULTI-DIMENSIONAL
  19845. C  STEPPING SEARCH SAVING AC'S AND MODIFYING. ACTUALLY WILL HANDLE ANY
  19846. C  CELL. UP TO 8 DIMENSIONS PERMITTED (ARBITRARY LIMIT).
  19847. C  NOTE THAT RECALCULATE SPECIAL VARY FLAG WILL BE SET HERE IF
  19848. C  VARYING MORE THAN ONCE...
  19849. C  WILL VARY ONE OF THE AC'S IN THE LIST P,Q,R,S,T... BY INITIAL
  19850. C  FRACTION W (AN ARBITRARY "STEP SIZE" FRACTION) AND COMPUTE THE
  19851. C  GRADIENT OF (X-A) WRT THAT AC, THEN WILL REPLACE ALL AC'S AND
  19852. C  VARY THAT AC BY W * THE GRADIENT, MEANING THAT AS THE GRADIENT
  19853. C  DECREASES, THE VARIANCE DOES ALSO. LAST GRADIENTS ARE SAVED AND
  19854. C  USED AS INITIAL VARIANCES, SO THAT THE W FRACTION IS AN INITIAL
  19855. C  GUESS. HOWEVER IT ALSO IS A LIMIT SO NO STEP VARIES AN AC BY
  19856. C  MORE FRACTIONALLY THAN W.
  19857. C   ONCE THIS IS DONE ANOTHER ONE OF THE P,Q,R,S,T,... LIST IS
  19858. C  CHOSEN CIRCULARLY AND THE PROCESS REPEATS. THIS MAY CONTINUE
  19859. C  INDEFINITELY TO LOOK FOR CONVERGENCE.
  19860. C   NOTE THAT X AND A MAY BE ANY CELL AND NEED NOT BE ACCUMULATORS.
  19861. C  HOWEVER ALL OTHER CELLS TO VARY MUST BE AC'S AND MUST BE THE
  19862. C  INDEPENDENT VARIABLES. CALCULATIONS ELSEWHERE ON THE SHEET
  19863. C  (PERHAPS LATER IN THE SAME CELL...)MUST ESTABLISH DEPENDENT
  19864. C  VARIABLES OR BOUNDARY OR NORMALIZATION CONDITIONS.
  19865. 2000    CONTINUE
  19866.     RETCD=1
  19867. C SPLIT OFF THESE FUNCTIONS INTO A COMMON SUBROUTINE
  19868.     CALL VVARY(LINE,RETCD,K)
  19869.     RETURN
  19870. 2100    CONTINUE
  19871. C EXECUTE COMMAND. FILL IN COMMAND FROM GIVEN FUNCTION AND
  19872. C CALL XQTCMD TO DO IT. SETS UP NECESSARY VARIABLES FIRST.
  19873. C ASSUME THE COMMAND LINE MUST BE ALONE ON LINE AFTER THIS CALL...
  19874.     KK=1
  19875.     KKK=K+6
  19876.     DO 2101 NN=KKK,80
  19877.     XTNCMD(KK)=LINE(NN)
  19878.     IF(ICHAR(XTNCMD(KK)).LE.0)GOTO 2102
  19879.     KK=KK+1
  19880. 2101    CONTINUE
  19881. 2102    CONTINUE
  19882.     XTNCMD(KK+1)=0
  19883.     XTNCMD(KK+2)=0
  19884.     XTNCNT=KK
  19885.     XTCFG=1
  19886.     IPSET=1
  19887.     CALL XQTCMD(ICODE)
  19888.     RETURN
  19889. 2200    CONTINUE
  19890. C RETURN PACKED FORMULA STRING TO EXTRACT UP TO 8 CHARS OF
  19891. C FORMULA.
  19892. C START AT K+6
  19893.     XAC=0.
  19894.     IBGN=K+6
  19895.     IEND=IBGN+20
  19896.     CALL VARSCN(LINE,IBGN,IEND,LSTC,I1,I2,IVLD)
  19897.     IF(IVLD.LE.0)RETURN
  19898. C GET START, LENGTH NOW IN FORMULA...
  19899.     IBGN=LSTC+1
  19900.     IEND=IBGN+20
  19901.     CALL GN(IBGN,IEND,ISTART,LINE)
  19902.     IBGN=INDX(LINE,ICHAR(';'))
  19903. C LOOK FOR ';' CHAR AS START OF 2ND NUMBER
  19904.     IF(IBGN.GT.50.OR.ISTART.LE.0.OR.ISTART.GT.80)RETURN
  19905. C BUMP IBGN PAST THE ; CHAR
  19906.     IBGN=IBGN+1
  19907.     IEND=80
  19908.     CALL GN(IBGN,IEND,ILN,LINE)
  19909.     ILN=MIN0(ILN,8)
  19910.     IF(ILN.LE.0)RETURN
  19911. C READ IN FORMULA INTO WRK ARRAY
  19912. C    IRX=(I2-1)*60+I1
  19913.     CALL REFLEC(I2,I1,IRX)
  19914.     CALL WRKFIL(IRX,WRK2,0)
  19915.     CALL CE2A(WRK2,WRK)
  19916.     KZ=0
  19917.     DO 991 NN=1,ILN
  19918.     K=ICHAR(WRK(ISTART+NN-1))
  19919. C    K=K.AND.127
  19920.     IF(K.EQ.0)KZ=1
  19921.     IF(KZ.EQ.1)K=0
  19922. C STOP THE ENCODE ON SEEING ANY NULLS
  19923.     TMP=K
  19924.     XAC=XAC*128.D0+TMP
  19925. 991    CONTINUE
  19926. C XAC RETURNS WITH ENCODED VALUE.
  19927.     RETURN
  19928. 2300    CONTINUE
  19929. C RETURN PRESENT LOCATION IN THE MATRIX.
  19930.     TAC=PROW
  19931.     UAC=PCOL
  19932.     XAC=(PCOL-1)*MCols+PROW
  19933.     VAC=4*FORMFG+2*RCFGX+RCONE
  19934. C    VAC=(DROW-1)*20+DCOL
  19935. C RESULT IN % IS PHYS SHEET HASHCODE
  19936. C RESULT IN V ACCUMULATOR IS DISPLAY SHEET LOC HASHCODE
  19937. C T AND U ACCUMULATORS GET PHYS COL, ROW OFFSET.
  19938.     WAC=RRWACT
  19939.     YAC=RCLACT
  19940. C W AND Y GET LIMITS CURRENTLY USED
  19941.     RETURN
  19942. 2400    CONTINUE
  19943. C YRMOD
  19944.     RETCD=1
  19945.     IBGN=K+6
  19946.     LEND=IBGN+20
  19947.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1A,ID2A,IVALID)
  19948.     IF(IVALID.EQ.0)GOTO 9300
  19949.     IF(LINE(LSTCHR).NE.',')GOTO 9300
  19950.     IBGN=LSTCHR+1
  19951.     LEND=IBGN+20
  19952.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1B,ID2B,IVALID)
  19953.     IF(IVALID.EQ.0)GOTO 9300
  19954.     IF(LINE(LSTCHR).NE.',')GOTO 9300
  19955.     IBGN=LSTCHR+1
  19956.     LEND=IBGN+20
  19957.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1C,ID2C,IVALID)
  19958.     IF(IVALID.EQ.0)GOTO 9300
  19959. C
  19960. C V1, V2, V3 ARE YR, MONTH, DAY FOR RETURN OF JULIAN DATE
  19961. C
  19962.     CALL XVBLGT(ID1A,ID2A,XVBLS(1,1))
  19963.     IYR=XVBLS(1,1)
  19964.     CALL XVBLGT(ID1B,ID2B,XVBLS(1,1))
  19965.     IMO=XVBLS(1,1)
  19966.     CALL XVBLGT(ID1C,ID2C,XVBLS(1,1))
  19967.     IDA=XVBLS(1,1)
  19968. C RETURN JULIAN DATE FROM Y, M, D GIVEN
  19969.     XAC=JULMDY(IYR,IMO,IDA)
  19970.     RETURN
  19971. 2500    CONTINUE
  19972. C JDATE
  19973.     RETCD=1
  19974.     IBGN=K+6
  19975.     LEND=IBGN+20
  19976. C GET V1 WHICH HAS VARIABLE WITH THE STRING IN IT
  19977.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1A,ID2A,IVALID)
  19978.     IF(IVALID.EQ.0)GOTO 9300
  19979. C RETURN JULIAN DATE NOW AFTER FETCHING FORMULA.
  19980. C    IRX=(ID2A-1)*60+ID1A
  19981.     CALL REFLEC(ID2A,ID1A,IRX)
  19982.     CALL WRKFIL(IRX,WRK,0)
  19983.     XAC=JULIAN(WRK)
  19984.     RETURN
  19985. 2600    CONTINUE
  19986. C JTOCH
  19987.     RETCD=1
  19988.     IBGN=K+6
  19989.     LEND=IBGN+20
  19990. C V1 = JULIAN DATE
  19991. C V2 IS WHERE TO STORE ASCII DATE STRING AS FORMULA.
  19992.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1A,ID2A,IVALID)
  19993.     IF(IVALID.EQ.0)GOTO 9300
  19994.     IF(LINE(LSTCHR).NE.',')GOTO 9300
  19995.     IBGN=LSTCHR+1
  19996.     LEND=IBGN+20
  19997.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1B,ID2B,IVALID)
  19998.     IF(IVALID.EQ.0)GOTO 9300
  19999.     CALL XVBLGT(ID1A,ID2A,XVBLS(1,1))
  20000.     IJUL=XVBLS(1,1)
  20001. C    IRX=(ID2B-1)*60+ID1B
  20002.     CALL REFLEC(ID2B,ID1B,IRX)
  20003.     CALL WRKFIL(IRX,WRK,0)
  20004.     DO 2502 N=1,110
  20005. 2502    WRK(N)=0
  20006.     CALL JULASC(IJUL,WRK,IYR,IMO,IDA)
  20007.     CALL WRKFIL(IRX,WRK,1)
  20008. C WRITE THE FORMULA BACK OUT
  20009.     TAC=IMO
  20010.     UAC=IDA
  20011.     VAC=IYR
  20012. C RETURN T,U,V AS M,D,Y ALSO
  20013.     RETURN
  20014. 2700    CONTINUE
  20015. C DATE
  20016.     RETCD=1
  20017.     IBGN=K+5
  20018.     LEND=IBGN+20
  20019.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1A,ID2A,IVALID)
  20020.     IF(IVALID.EQ.0)GOTO 9300
  20021.     IF(LINE(LSTCHR).NE.',')GOTO 9300
  20022.     IBGN=LSTCHR+1
  20023.     LEND=IBGN+20
  20024.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1B,ID2B,IVALID)
  20025.     IF(IVALID.EQ.0)GOTO 9300
  20026.     IF(LINE(LSTCHR).NE.',')GOTO 9300
  20027.     IBGN=LSTCHR+1
  20028.     LEND=IBGN+20
  20029.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1C,ID2C,IVALID)
  20030.     IF(IVALID.EQ.0)GOTO 9300
  20031.     IF(LINE(LSTCHR).NE.',')GOTO 9300
  20032.     IBGN=LSTCHR+1
  20033.     LEND=IBGN+20
  20034.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1D,ID2D,IVALID)
  20035.     IF(IVALID.EQ.0)GOTO 9300
  20036.     CALL XVBLGT(ID1A,ID2A,XVBLS(1,1))
  20037.     IYR=XVBLS(1,1)
  20038.     CALL XVBLGT(ID1B,ID2B,XVBLS(1,1))
  20039.     IMO=XVBLS(1,1)
  20040.     CALL XVBLGT(ID1C,ID2C,XVBLS(1,1))
  20041.     IDA=XVBLS(1,1)
  20042. C    IRX=(ID2D-1)*60+ID1D
  20043.     CALL REFLEC(ID2D,ID1D,IRX)
  20044.     CALL WRKFIL(IRX,WRK,0)
  20045.     DO 2702 N=1,110
  20046. 2702    WRK(N)=0
  20047.     IJUL=JULMDY(IYR,IMO,IDA)
  20048.     CALL JULASC(IJUL,WRK,IYR,IMO,IDA)
  20049.     CALL WRKFIL(IRX,WRK,1)
  20050.     GOTO 9300
  20051. 2900    CONTINUE
  20052.     RETCD=1
  20053. C WKDYS - GIVE WEEKDAYS (M-F) BETWEEN 2 JULIAN DATES THAT MUST
  20054. C BE IN CELLS.
  20055.     IBGN=K+6
  20056.     LEND=IBGN+20
  20057.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1A,ID2A,IVALID)
  20058.     IF(IVALID.EQ.0)GOTO 9300
  20059.     IF(LINE(LSTCHR).NE.',')GOTO 9300
  20060.     IBGN=LSTCHR+1
  20061.     LEND=IBGN+20
  20062.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1B,ID2B,IVALID)
  20063.     IF(IVALID.EQ.0)GOTO 9300
  20064.     CALL XVBLGT(ID1A,ID2A,XVBLS(1,1))
  20065.     IYR=XVBLS(1,1)
  20066.     CALL XVBLGT(ID1B,ID2B,XVBLS(1,1))
  20067.     IMO=XVBLS(1,1)
  20068. C IYR HOLDS START JULIAN DATE, IMO HOLDS END ONE
  20069.     CALL WKDY(IYR,IMO,IDA)
  20070. C IDA = NUMBER WORK DAYS BETWEEN THE DATES
  20071.     XAC=IDA
  20072. C RETURN DAYS
  20073.     GOTO 9300
  20074. 3000    CONTINUE
  20075.     RETCD=1
  20076. C WKDIN - GIVEN A JULIAN DATE AND A NUMBER WORKDAYS, RETURN THE
  20077. C ENDING JULIAN DATE AFTER THAT NUMBER JULIAN DAYS.
  20078.     IBGN=K+6
  20079.     LEND=IBGN+20
  20080.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1A,ID2A,IVALID)
  20081.     IF(IVALID.EQ.0)GOTO 9300
  20082.     IF(LINE(LSTCHR).NE.',')GOTO 9300
  20083.     IBGN=LSTCHR+1
  20084.     LEND=IBGN+20
  20085.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1B,ID2B,IVALID)
  20086.     IF(IVALID.EQ.0)GOTO 9300
  20087.     CALL XVBLGT(ID1A,ID2A,XVBLS(1,1))
  20088.     IYR=XVBLS(1,1)
  20089.     CALL XVBLGT(ID1B,ID2B,XVBLS(1,1))
  20090.     IMO=XVBLS(1,1)
  20091. C IYR = START DATE, JULIAN. IMO = NUMBER DAYS. RETURN END DATE JULIAN.
  20092.     CALL WRKINT(IYR,IMO,IDA)
  20093. C IDA = RETURN JULIAN DATE
  20094.     XAC=IDA
  20095.     GOTO 9300
  20096. 3100    CONTINUE
  20097. C FFTFW
  20098.     ISI=1
  20099.     GOTO 3210
  20100. 3200    CONTINUE
  20101. C FFTRV
  20102.     ISI=-1
  20103. 3210    CONTINUE
  20104.     RETCD=1
  20105. C MERGED FFT CODE
  20106. C *U FFTFW V1:V2 DOES FFT OF RANGE GIVEN (1-DIM)
  20107. C DITTO FFTRV BUT ONE IS REVERSE AND ONE IS FORWARD FFT
  20108. C REAL*8 FFT ROUTINE USED.
  20109.     IBGN=K+6
  20110.     CALL PMTX2(RETCD,1,LINE,IBGN,IR1T,IC1T,IR1B,IC1B,
  20111.      1  IV,IV,IV,IV,IV,IV,IV,IV)
  20112.     IC=0
  20113.     IR=1
  20114.     IF(IR1T.EQ.IR1B)GOTO 3220
  20115.     IC=1
  20116.     IR=0
  20117. 3220    CONTINUE
  20118.     KK=IABS(IR1T-IR1B)+1
  20119.     KKK=IABS(IC1T-IC1B)+1
  20120.     IV=MAX0(KK,KKK)
  20121. C IV = NO. POINTS.
  20122.     CALL FOUREA(IR1T,IC1T,IC,IR,IV,ISI)
  20123. C THAT'S ALL FOR FFT. REPLACES CELLS IN PLACE...
  20124.     GOTO 9300
  20125. 3300    CONTINUE
  20126. C LINEF
  20127. C *U LINEF VY1:VY2[,VX1:VX2]
  20128. C WHERE X COORDS CAN BE SKIPPED...
  20129.     IBGN=K+6
  20130.     RETCD=1
  20131. C JUST GET 2 MATRICES' VALUES. IF RETCD=3 ON RETURN, 2ND MATRIX MUST HAVE
  20132. C BEEN MISSING SO FLAG IT THAT WAY.
  20133.     CALL PMTX2(RETCD,2,LINE,IBGN,IR1T,IC1T,IR1B,IC1B,IR2T,IC2T,
  20134.      1  IR2B,IC2B,KK,KK,KK,KK)
  20135.     IF(RETCD.NE.1)IR2T=-1
  20136.     RETCD=1
  20137.     KK=IABS(IR1T-IR1B)+1
  20138.     KKK=IABS(IC1T-IC1B)+1
  20139.     IV=MAX0(KK,KKK)
  20140.     KK=0
  20141.     IF(IR1T.EQ.IR1B)GOTO 3320
  20142.     KK=1
  20143. 3320    CONTINUE
  20144.     CALL LINFIT(IR2T,IC2T,KK,IR1T,IC1T,IV,TAC,UAC,XAC,WAC)
  20145. C RETURN A VALUE IN T, B VALUE IN U, AND DEL VALUE IN %.
  20146. C FOR Y = A + BX
  20147. C W AC RETURNS CORRELATION COEFFICIENT.
  20148.     GOTO 9300
  20149. 3400    CONTINUE
  20150. C *U DBxxxx FUNCTIONS PARSED EXTERNALLY
  20151. C (SAVES MUCH SPACE AND EASES MODIFICATION...)
  20152.     RETCD=1
  20153.     CALL DTRFCT(LINE(K+2),RETCD)
  20154.     GOTO 9300
  20155. 3500    CONTINUE
  20156. C *U STxxxx FUNCTIONS
  20157.     RETCD=1
  20158. C K SHOULD BE SUBSCRIPT OF THE 'S' OF "ST" SO SKIP BY THE
  20159. C "ST" PART AND JUST PASS THE REST OF THE FUNCTION NAME AT THE
  20160. C START OF THE STRING...
  20161.     CALL SCIFCT(LINE(K+2),RETCD)
  20162. C HANDLE ALL *U STXXXX FUNCTIONS IN SEPARATE ROUTINE FOR EASE OF
  20163. C MOVING IT AROUND. (MIGHT EVEN GO BACK TO PDP11!)
  20164. C    GOTO 9300
  20165. 9300    RETURN
  20166.     END
  20167. c -h- scifct.fam
  20168. C SCIENTIFIC FUNCTION CALLER
  20169. C This version is a dummy placeholder.
  20170. C The SCIFCT subroutine exists to allow AnalytiCalc to call just
  20171. C about *ANY* Fortran callable routine.
  20172. C   The operation is to use a formula in AnalytiCalc which includes
  20173. c a call of form:
  20174. c  *U STxxxxxx range;range;range;range;range;...;range>outrange;outrange;outrange
  20175. c so that the "xxxxxx" part is the function name to be called.
  20176. c  input ranges are the parts of the sheet for input to the function; these
  20177. c are internally copied to a large array (defined here) which is a normal
  20178. c Fortran array. They are converted to integer*4 as needed if the function
  20179. c being called needs this. Once all conversion is done, the subroutine is
  20180. c called using an argument list built up by this call list. At the end,
  20181. c the output ranges are filled in from the internal Fortran array.
  20182. c   Because Fortran callable subroutines (e.g. those in the SSP) may pass
  20183. c their return arguments in ANY of their arguments, seeing a ; will increment
  20184. c the output range counter.
  20185. c
  20186. c To add more:
  20187. c  * Select desired sizes for work area (must be big enough to hold ALL
  20188. c  arguments used), max number of arguments per function, etc.
  20189. c  * Add new function name and characteristics to tables. Note that the
  20190. c  name, integer/float stuff for all args, which arg is first OUTPUT arg,
  20191. c  and map of output args, all are needed. Don't make first output arg
  20192. c  bigger than the max. number of args.
  20193. c  * Add another call and element in the computed GOTO for each function
  20194. c  desired.
  20195. c  * Build and enjoy.
  20196. c
  20197. c   Internally we need tables of
  20198. c      * Function names (up to 6 characters long per classical Fortran rules)
  20199. c      * Number of arguments needed per function
  20200. c      * Integer/real flags for arguments' data types
  20201. c      * First output argument number (user convenience and less error
  20202. c           prone than having to have a bunch of ;;;;'s to force the
  20203. c           outputrange to come from the right area
  20204. c      * Length of the Fortran array used for each input argument
  20205. c Note: Provision is made for "scratch array" arguments, but is a bit
  20206. c  crude. However, if extra space is needed, user can specify a larger
  20207. c  input area and the larger chunk of scratch space will be present.
  20208. c  Unused argument areas will generally be zeroed on each call.
  20209. c   It is perfectly reasonable to have input-only functions (e.g. plots)
  20210. c   or several subroutines called in sequence for a function.
  20211. c
  20212.     SUBROUTINE SCIFCT(LINE,RETCD)
  20213.     Integer BigSpc
  20214.     Parameter (BigSpc=256)
  20215.     Parameter (MaxArgs=10)
  20216.     Parameter (NFCT=3)
  20217. c NFCT is number of functions included in the list. Update the parameter
  20218. c and the tables together (please!)
  20219.     INTEGER RETCD
  20220.     Character*1 LINE(80)
  20221.     Real*8 ArgAry(BigSpc)
  20222.     INTEGER*4 IARGAR(2,BIGSPC)
  20223.     EQUIVALENCE(IARGAR(1,1),ARGARY(1))
  20224.     Integer*4 ArgCtr,IntPar
  20225.     Integer*4 ArgPtr(MaxArgs)
  20226.     Integer*4 NARGin(NFct)
  20227. c nargin is number input args needed.
  20228.     Integer*4 OutArg(MaxArgs,NFct)
  20229.     Integer*4 OutBgn(NFct)
  20230. c OutArg is 0 for no output, 1 for output area
  20231.     Integer*4 RevStr(MaxArgs,NFct)
  20232. c RevStr will be nonzero to reverse storage of arrays
  20233. c from normal row-first to column-first order.
  20234.     Integer*4 IsReal(MaxArgs,NFCT)
  20235. c
  20236. C Since there are some subs that need dummy argument scratch
  20237. c areas, encode IsReal as follows:
  20238. c  0 = Real
  20239. c  -1 = Integer
  20240. c  +nn = Use argument nn's VALUE (after grabbing it) for
  20241. c        size of area to allocate. Always allocate floats
  20242. c        since they're longer.
  20243. c
  20244. c Note: Due to the way the program allocates scratch array, the
  20245. c  arguments with size info for dummy arrays must be present
  20246. c  ahead of the scratch space arguments.
  20247. c
  20248. C Argument coordinate lists
  20249.     Integer*4 InCord(4,MaxArgs)
  20250.     Integer*4 InType(MaxArgs)
  20251.     Integer*4 OutCor(4,MaxArgs)
  20252.     REAL*8 R8WRK,R8WRK2
  20253.     INTEGER*4 I4WRK,I4WRK2
  20254.     Integer*4 OutTyp(MaxArgs)
  20255. c
  20256.     Character*6 WrkFnm
  20257.     Character*1 WFNm(6)
  20258.     Equivalence(WFNm(1),WrkFnm)
  20259.     Integer*4 IniOut(NFCT)
  20260.     Integer*4 AryPtr
  20261.     Character*6 FName(NFCT)
  20262.     Character*1 FNameB(6,NFCT)
  20263.     Equivalence(Fname(1),FNameB(1,1))
  20264. c allows access of function names by byte, but data stmts to set up
  20265. c as full names...
  20266. c    This example has only 2 functions:
  20267. c  *U STDLLSQ   and
  20268. c  *U STCHISQ
  20269. c        from the Scientific Subroutine Package library...
  20270.     Data FnameB/
  20271.      1  'D','L','L','S','Q',0,
  20272.      2  'C','H','I','S','Q',0,
  20273.      3  'V','E','C','N','O','R' /
  20274.     DATA IsReal/
  20275.      1  0,0,-1,-1,-1,0,5,0,-1,0,
  20276.      2  0,-1,-1,0,-1,-1,2,3,0,0,
  20277.      3  0,-1,0,0,0,0,0,0,0,0  /
  20278.     DATA OutBgn/
  20279.      1  6,4,3 /
  20280.     DATA OutArg/
  20281.      1  0,0,0,0,0,1,0,0,1,1,
  20282.      2  0,0,0,1,1,1,0,0,0,0,
  20283.      3  0,0,1,0,0,0,0,0,0,0 /
  20284. c Note OutArg is just which output arguments are really
  20285. c output data. 1 means they are, 0 means they're not.
  20286. c
  20287. C NARGIN is min number input arguments that must be present.
  20288.     Data NARGin/10,8,3/
  20289.     Data RevStr/
  20290.      1  0,0,0,0,0,0,0,0,0,0,
  20291.      2  0,0,0,0,0,0,0,0,0,0,
  20292.      3  0,0,0,0,0,0,0,0,0,0/
  20293. C
  20294. C FIRST, before we spend a lot of effort grabbing arguments, make
  20295. c  sure we know about the function to be called. If we don't, just
  20296. c  return an error.
  20297.     KK=0
  20298.     DO 101 N=1,NFCT
  20299.     DO 110 NN=1,6
  20300.     IF(Ichar(FNAMEB(NN,N)).LE.0)GOTO 110
  20301.     IF(LINE(NN).NE.FNAMEB(NN,N)) GOTO 112
  20302. 110    CONTINUE
  20303. C WE FELL THRU AND FOUND THE NAME. SAVE ITS' INDEX.
  20304.     KK=N
  20305. 112    CONTINUE
  20306. 101    CONTINUE
  20307.     IF(KK.GT.0)GOTO 115
  20308. 114    RETCD=3
  20309.     RETURN
  20310. 115    CONTINUE
  20311.     NFUNCT=KK
  20312. c A little setup...
  20313.     ArgCtr=1
  20314.     IntPar=1
  20315. c integer "parity", used to pack integer args in work array
  20316.     Aryptr=1
  20317.     Do 1 n=1,MaxArgs
  20318.     Argptr(n)=1
  20319.     Do 11 nn=1,4
  20320.     InCord(nn,n)=0
  20321.     OutCor(nn,n)=0
  20322. 11    Continue
  20323. 1    CONTINUE
  20324.     DO 2 N=1,BigSpc
  20325.     ArgAry(N)=0.0D0
  20326. 2    Continue
  20327. C arrange for all uninitialized numbers to contain zeroes
  20328.     RETCD=1
  20329. C HANDLE *U STXXXX FUNCTIONS. LINE ARRAY PASSED IN HERE
  20330. C STARTS AFTER THE "ST" SO WE CAN DECODE IT.
  20331. c if we can't get the function, return RETCD=3...
  20332. c
  20333. c Now grab the arguments and store them in InCord, Intype, OutCor, OutTyp
  20334.     K=INDXQ(LINE,32)
  20335. C FIND STUFF AFTER SPACE
  20336.     K=K+1
  20337.     NArg=1
  20338.     IBGN=1
  20339. 100    Continue
  20340.     LEND=IBGN+20
  20341. C GET LOC OF MATRIX A (MUST BE SQUARE)
  20342.     ID1B=0
  20343.     ID2B=0
  20344.     ID1A=0
  20345.     ID2A=0
  20346.     CALL VARSCN(LINE(K),IBGN,LEND,LSTCHR,ID1A,ID2A,IVALID)
  20347.     IF(IVALID.EQ.0)GOTO 300
  20348.     IF(LINE(K+LSTCHR-1).NE.':')GOTO 1000
  20349.     IBGN=LSTCHR+1
  20350.     LEND=IBGN+20
  20351.     CALL VARSCN(LINE(K),IBGN,LEND,LSTCHR,ID1B,ID2B,IVALID)
  20352.     IF(IVALID.EQ.0)GOTO 300
  20353. 1000    CONTINUE
  20354. C GMTX GETS ARGS FOR ONE RANGE
  20355.     InCord(1,NArg)=ID1A
  20356.     InCord(2,NArg)=ID2A
  20357.     INCord(3,NARG)=ID1B
  20358.     INCORD(4,NARG)=ID2B
  20359.     IBGN=LSTCHR+1
  20360.     NARG=NARG+1
  20361.     IF(LINE(K+LSTCHR-1).EQ.';')GOTO 100
  20362. C
  20363. 300    CONTINUE
  20364. C NOW HAVE ALL ARGS FOR INPUT COLLECTED
  20365.     INARGS=NARG
  20366.     If(INargs.lt.NARGin(NFunct)) GOTO 114
  20367. c Flag error if not enough input args presented.
  20368.     K=INDXQ(LINE,62)
  20369. C FIND STUFF AFTER > CHARACTER
  20370.     IF(K.EQ.0.OR.K.GT.70)GOTO 500
  20371. C MUST HAVE A > OR no outputs are present.
  20372. C This is perfectly legal; outputs like graphs or auxiliary
  20373. C files (unknown to rest of program) are possible too.
  20374.     K=K+1
  20375.     NArg=1
  20376.     IBGN=1
  20377. 400    Continue
  20378.     LEND=IBGN+20
  20379. C GET LOC OF MATRIX A (MUST BE SQUARE)
  20380.     ID1B=0
  20381.     ID2B=0
  20382.     ID1A=0
  20383.     ID2A=0
  20384. C TEST FOR NULL ARGUMENT (;; PAIR)
  20385.     IF(LINE(K+IBGN-1).EQ.';')GOTO 450
  20386.     CALL VARSCN(LINE(K),IBGN,LEND,LSTCHR,ID1A,ID2A,IVALID)
  20387.     IF(IVALID.EQ.0)GOTO 500
  20388.     IF(LINE(K+LSTCHR-1).NE.':')GOTO 1500
  20389.     IBGN=LSTCHR+1
  20390.     LEND=IBGN+20
  20391.     CALL VARSCN(LINE(K),IBGN,LEND,LSTCHR,ID1B,ID2B,IVALID)
  20392.     IF(IVALID.EQ.0)GOTO 500
  20393. 1500    CONTINUE
  20394.     IBGN=LSTCHR+1
  20395.     GOTO 455
  20396. 450    CONTINUE
  20397.     IBGN=IBGN+1
  20398.     LSTCHR=IBGN
  20399. C PASS ;
  20400. 455    CONTINUE
  20401. C GMTX GETS ARGS FOR ONE RANGE
  20402.     OUTCor(1,NArg)=ID1A
  20403.     OUTCor(2,NArg)=ID2A
  20404.     OUTCor(3,NARG)=ID1B
  20405.     OUTCor(4,NARG)=ID2B
  20406.     NARG=NARG+1
  20407.     IF(LINE(K+LSTCHR-1).EQ.';')GOTO 400
  20408. C    GOTO 500
  20409. C
  20410. 500    CONTINUE
  20411. C NOW HAVE OUTPUT ARGUMENT LIST COLLECTED
  20412. C BEGIN COLLECTING DATA
  20413.     NARG=1
  20414.     IntPar=1
  20415. 2000    CONTINUE
  20416.     IACNTR=ARGCTR
  20417. C  GET INPUT DATA INTO OUR BIG ARRAY
  20418.     IF(INCORD(1,NARG).LE.0)GOTO 3000
  20419.     ARGPTR(NARG)=ARGCTR
  20420.     IF(INCORD(3,NARG).NE.0)GOTO 2011
  20421. C SINGLE ARGUMENT; GRAB IT
  20422.     nn=incord(1,narg)
  20423.     mm=incord(2,narg)
  20424.     call typget(nn,mm,itype)
  20425.     If(Itype.ne.4) then
  20426.       CALL XVBLGT(NN,MM,R8WRK)
  20427.     Else
  20428.       Call JVBLGT(NN,MM,I4wrk)
  20429.       R8WRK=I4WRK
  20430.     End If
  20431. c    CALL XVBLGT(INCORD(1,NARG),INCORD(2,NARG),R8WRK)
  20432.     IF(ISREAL(NARG,NFUNCT).LT.0) THEN
  20433.       INTPAR=1
  20434.       I4WRK=R8WRK
  20435.       IARGAR(IntPar,ARGCTR)=I4WRK
  20436.     ELSE
  20437.       If(IntPar.ne.1)ARGCTR=MIN0(ARGCTR+1,BigSpc)
  20438.       IntPar=1
  20439. C if we last packed the second word of an integer, bump to next
  20440.       ARGARY(ARGCTR)=R8WRK
  20441.     END IF
  20442.     ARGCTR=MIN0(ARGCTR+1,BigSpc)
  20443.     NARG=NARG+1
  20444.     GOTO 2000
  20445. 2011    CONTINUE
  20446. C 2-D AREA
  20447.     IntPar=1
  20448.     DO 2020 LNN=INCORD(1,NARG),INCORD(3,NARG)
  20449.     DO 2020 LMM=INCORD(2,NARG),INCORD(4,NARG)
  20450.     NN=LNN
  20451.     IF(REVSTR(NARG,NFUNCT).NE.0)NN=LMM
  20452.     MM=LMM
  20453.     IF(REVSTR(NARG,NFUNCT).NE.0)MM=LNN
  20454.     call typget(nn,mm,itype)
  20455.     If(Itype.ne.4) then
  20456.       CALL XVBLGT(NN,MM,R8WRK)
  20457.     Else
  20458.       Call JVBLGT(NN,MM,I4wrk)
  20459.       R8WRK=I4WRK
  20460.     End If
  20461.     IF(ISREAL(NARG,NFUNCT).LT.0) THEN
  20462.       I4WRK=R8WRK
  20463.       IARGAR(IntPar,ARGCTR)=I4WRK
  20464.       IntPar=3-IntPar
  20465. c if IntPar is 1 make it 2; if it's 2, make it 1
  20466.     ELSE
  20467.       If(IntPar.ne.1)ARGCTR=MIN0(ARGCTR+1,BigSpc)
  20468.       IntPar=1
  20469. C if we last packed the second word of an integer, bump to next
  20470.       ARGARY(ARGCTR)=R8WRK
  20471.     END IF
  20472.     If(IntPar.eq.1)ARGCTR=MIN0(ARGCTR+1,BigSpc)
  20473. 2020    CONTINUE
  20474.     NARG=NARG+1
  20475.     ARGCTR=MIN0(ARGCTR+1,BigSpc)
  20476.     IntPar=1
  20477. C
  20478. C FIX UP DUMMY ARGUMENTS
  20479. C
  20480.     IF(ISREAL(NARG,NFUNCT).GT.0.AND.ISREAL(NARG,NFUNCT)
  20481.      1  .LE.MAXARGS) THEN
  20482. c If user allocated more space than the dummy calc, use bigger
  20483. c allocation. However, add a little more and check for array
  20484. c overflow.
  20485.       ARGCTR=MAX0(ARGCTR,IACNTR+IARGAR(1,ISREAL(NARG,NFUNCT)))
  20486.       ARGCTR=ARGCTR+30
  20487.       ARGCTR=MIN0(ARGCTR+1,BigSpc)
  20488. C ADD A LITTLE FOR GOOD LUCK
  20489.     END IF
  20490.     GOTO 2000
  20491. 3000    CONTINUE
  20492. C NOW SHOULD BE READY TO CALL THIS STUFF...
  20493. C GENERATE CALLS LIKE THE TEMPLATES BELOW. NO NEED TO MODIFY
  20494. C THE FUNCTIONS, BUT WE DO NEED TO MESS WITH THIS STUFF BECAUSE
  20495. C I DON'T KNOW OFFHAND HOW TO DO A DYNAMIC CALLING LIST IN FORTRAN
  20496. C THAT'LL WORK ON STACK IMPLEMENTATIONS.
  20497. c
  20498. c Add more numbers to the list here to get more function calls.
  20499. c
  20500.     GOTO (4001,4002,4003),NFUNCT
  20501.     RETCD=3
  20502.     RETURN
  20503. c *************** BEGINNING OF CALLS ****************
  20504. 4001    CONTINUE
  20505. C DLLSQ FUNCTION.... 10 ARGS
  20506.     CALL DLLSQ(ARGARY(ARGPTR(1)),ARGARY(ARGPTR(2)),
  20507.      1  ARGARY(ARGPTR(3)),ARGARY(ARGPTR(4)),ARGARY(ARGPTR(5)),
  20508.      2  ARGARY(ARGPTR(6)),ARGARY(ARGPTR(7)),ARGARY(ARGPTR(8)),
  20509.      3  ARGARY(ARGPTR(9)),ARGARY(ARGPTR(10)))
  20510.     GOTO 5000
  20511. 4002    CONTINUE
  20512. C CHISQ FUNCTION.... 8 ARGS
  20513.     CALL CHISQ(ARGARY(ARGPTR(1)),ARGARY(ARGPTR(2)),
  20514.      1  ARGARY(ARGPTR(3)),ARGARY(ARGPTR(4)),ARGARY(ARGPTR(5)),
  20515.      2  ARGARY(ARGPTR(6)),ARGARY(ARGPTR(7)),ARGARY(ARGPTR(8)))
  20516.     GOTO 5000
  20517. 4003    CONTINUE
  20518. C Vector Norm function
  20519.     CALL VECNOR(ARGARY(ARGPTR(1)),ARGARY(ARGPTR(2)),
  20520.      1  ARGARY(ARGPTR(3)))
  20521. C Use this for debugging too...
  20522. c
  20523. c insert more function calls here... they all look alike except for
  20524. c function name.
  20525. c
  20526. c  It's also completely permissible to call several Fortran subroutines
  20527. c  in sequence here if it makes sense; it's up to the user. This code
  20528. c  just gives a way to call unmodified Fortran callable code and have
  20529. c  it make sense in the AnalytiCalc context. ANY Fortran callable code
  20530. c  is OK.
  20531. c
  20532. c *****************end of calls *****************
  20533. c
  20534. 5000    CONTINUE
  20535. C NOW GET ARGUMENTS BACK TO DUMP TO SHEET
  20536.     KARG=0
  20537.     DO 5100 NARG=OUTBGN(NFUNCT),MAXARGS
  20538.     KARG=KARG+1
  20539.     IF(OUTARG(NARG,NFUNCT).LE.0)GOTO 5100
  20540.     IF(OUTCOR(1,KARG).EQ.0)GOTO 5100
  20541. C +++
  20542.     ARGCTR=ARGPTR(NARG)
  20543.     IF(OUTCOR(3,KARG).NE.0)GOTO 6014
  20544. C SINGLE ARGUMENT; GRAB IT
  20545.     IF(ISREAL(NARG,NFUNCT).LT.0) THEN
  20546.       I4WRK=IARGAR(1,ARGCTR)
  20547.       R8WRK=I4WRK
  20548.     ELSE
  20549.       R8WRK=ARGARY(ARGCTR)
  20550.     END IF
  20551.     nn=outcor(1,karg)
  20552.     mm=outcor(2,karg)
  20553.     Call typget(nn,mm,itype)
  20554.     If (Itype.ne.4) then
  20555.       CALL XVBLST(NN,MM,R8WRK)
  20556.     Else
  20557.       I4WRK=R8WRK
  20558.       CALL JVBLST(nn,mm,I4WRK)
  20559.     End If
  20560.     ARGCTR=MIN0(ARGCTR+1,BigSpc)
  20561.     GOTO 5100
  20562. 6014    CONTINUE
  20563. C 2-D AREA
  20564.     DO 6020 LNN=OUTCOR(1,KARG),OUTCOR(3,KARG)
  20565.     DO 6020 LMM=OUTCOR(2,KARG),OUTCOR(4,KARG)
  20566.     NN=LNN
  20567.     IF(REVSTR(NARG,NFUNCT).NE.0)NN=LMM
  20568.     MM=LMM
  20569.     IF(REVSTR(NARG,NFUNCT).NE.0)MM=LNN
  20570.     IF(ISREAL(NARG,NFUNCT).LT.0) THEN
  20571.       I4WRK=IARGAR(1,ARGCTR)
  20572.       R8WRK=I4WRK
  20573.     ELSE
  20574.       R8WRK=ARGARY(ARGCTR)
  20575.     END IF
  20576.     Call typget(nn,mm,itype)
  20577.     If (Itype.ne.4) then
  20578.       CALL XVBLST(NN,MM,R8WRK)
  20579.     Else
  20580.       I4WRK=R8WRK
  20581.       CALL JVBLST(nn,mm,I4WRK)
  20582.     End If
  20583. c    CALL XVBLST(NN,MM,R8WRK)
  20584.     ARGCTR=MIN0(ARGCTR+1,BigSpc)
  20585. 6020    CONTINUE
  20586. C +++
  20587. 5100    CONTINUE
  20588. C AT LAST, DONE
  20589.     RETURN
  20590.     END
  20591.     Subroutine VecNor(InRng,NVEC,Val)
  20592. C test subroutine
  20593. c Computes norm of input range, where NVEC is number of
  20594. c elements in the INRNG array.
  20595.     REAL*8 InRng
  20596.     Dimension InRng(1)
  20597.     Integer*4 NVEC
  20598.     Real*8 Val,X
  20599. C    VAL=0.0d0
  20600.     If(NVEC.LE.0)val=-1.0
  20601.     If(NVEC.LE.0)return
  20602. c return -1 if bad dimensions.
  20603.     X=0.0D0
  20604.     Do 1 n=1,nvec
  20605.     x=x+InRng(n)*InRng(n)
  20606. 1    Continue
  20607.     x=dsqrt(x)
  20608.     Val=X
  20609.     Return
  20610.     End
  20611. c -h- JunkDum.for
  20612. c completely dummy versions of dllsq and chisq
  20613. C REMOVE these if you want to use the real ones (from
  20614. c the SSP library)
  20615.     Subroutine DLLSQ(A,B,C,D,E,F,G,H,I,J)
  20616.     RETURN
  20617.     END
  20618.     SUBROUTINE CHISQ(A,B,C,D,E,F,G,H)
  20619.     RETURN
  20620.     END
  20621. c -h- uvtgen.for    Fri Aug 22 13:36:30 1986    
  20622. C COPYRIGHT (C) 1983, 1984 GLENN AND MARY EVERHART
  20623. C ALL RIGHTS RESERVED
  20624. C
  20625. C    VT100 VIDEO DISPLAY COMMAND PROGRAM. CALLING SEQUENCE IS
  20626. C    CALL UVT100(CMD,N1,N2THE MANDS IN
  20627. C    THE PARAMETER LIST BELOW, AND N1 AND N2 ARE OPTIONAL PARAMETERS
  20628. C    DEPENDING UPON CMD. SEE THE UVT100 USER'S MANUAL FOR MORE DETAILS.
  20629. C
  20630. C
  20631. C BLACK AND WHITE SCREEN MODULE FOR ANSI TERMINALS
  20632. C ALSO COLOR SCREEN MODULE.
  20633. C COMMANDS 20 AND 21 SWITCH: 20 SETS B+W, 21 SETS COLOR MODE
  20634. C
  20635. C THIS VERSION MODIFIED FOR USE WITH PORTACALC.
  20636. C  ENTRIES NOT USED ARE DELETED, AND ALSO CODE ADDED TO SUPPORT COLOR
  20637. C  CRT'S THAT ARE BASICALLY VT100-LIKE WITH EXTENSIONS, OR VT100'S OR
  20638. C  EMULATORS WITH AVO OPTION.
  20639. C
  20640. C  OPERATION:
  20641. C    ON B+W VT100'S (WITH ADVANCED VIDEO), THE SET GRAPHICS CODES
  20642. C WILL BE USED AS FOLLOWS:
  20643. C  ALTERNATE ROWS WILL BE DISPLAYED IN BOLD
  20644. C  (ROW 3 TO 22 ONLY HOWEVER; THE REST IS NOT MATH AREA)
  20645. C COMMAND AND DISPLAY ROWS (23 AND 24 NORMALLY) WILL BE BOLDED ALWAYS.
  20646. C
  20647. C  IN COLOR MODE:
  20648. C    ON ED, SET BACKGROUND COLOR TO DARK BLUE
  20649. C    ALTERNATE ROWS WILL BE SET TO YELLOW OR GREEN
  20650. C  COLUMN LABEL ROW, LABEL ROW, AND ROW LABELS, AND COMMAND PROMPTS,
  20651. C  IN A DIFFERENT COLOR FOR EACH. DETERMINED AND SET AT TIME OF
  20652. C  CALL TO CURSOR POSITION.
  20653. C
  20654. C    AUTHOR:    GLENN EVERHART
  20655. C
  20656.       SUBROUTINE UVT100 ( CMD, N1, N2 )
  20657.       IMPLICIT INTEGER ( A - Z )
  20658.       DIMENSION PRL ( 6 )
  20659. C NOTE WE DECLARE THESE VARIABLES USED IN PORTACALC. THEY ARE ALL IN
  20660. C COMMONS, SO WE ADD NOTHING TO LENGTH OF THIS PROGRAM BY ADDING THEM.
  20661.     CHARACTER*1 FVLD
  20662.     DIMENSION FVLD(1,1)
  20663.     COMMON /FVLDC/FVLD
  20664. C ***<<<< RDD COMMON START >>>***
  20665.     InTeGer*4 RRWACT,RCLACT
  20666. C    COMMON/RCLACT/RRWACT,RCLACT
  20667.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  20668.      1  IDOL7,IDOL8
  20669. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  20670. C     1  IDOL7,IDOL8
  20671.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  20672. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  20673.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  20674. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  20675. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  20676. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  20677.     InTeGer*4 KLVL
  20678. C    COMMON/KLVL/KLVL
  20679.     InTeGer*4 IOLVL,IGOLD
  20680. C    COMMON/IOLVL/IOLVL
  20681. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  20682. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  20683.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  20684.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  20685.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  20686.      3  k3dfg,kcdelt,krdelt,kpag
  20687. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  20688. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  20689. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  20690. C ***<<< RDD COMMON END >>>***
  20691. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  20692. CCC    InTeGer*4 LLCMD,LLDSP
  20693. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  20694.     InTeGer*4 TYPE(1,1),VLEN(9)
  20695.     REAL*8 XVBLS(1,1)
  20696.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1)
  20697.     EQUIVALENCE(XVBLS(1,1),VBLS(1,1,1))
  20698.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  20699. C ICPOS COMMON HAS PHYS COORDS BEING DISPLAYED. MUST QUERY FVLD TO
  20700. C SEE WHETHER TO INTENSIFY THE FIELD FOR NEGATIVE...
  20701. C ***<<< XVXTCD COMMON START >>>***
  20702.     CHARACTER*1 OARRY(100)
  20703.     InTeGer*4 OSWIT,OCNTR
  20704. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  20705. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  20706.     InTeGer*4 IC1POS,IC2POS,MODFLG
  20707. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  20708.        InTeGer*4 XTCFG,IPSET,XTNCNT
  20709.        CHARACTER*1 XTNCMD(80)
  20710. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  20711. C VARY FLAG ITERATION COUNT
  20712.     INTEGER KALKIT
  20713. C    COMMON/VARYIT/KALKIT
  20714.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  20715.     InTeGer*4 RCMODE,IRCE1,IRCE2
  20716. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  20717. C     1  IRCE2
  20718. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  20719. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  20720. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  20721. C RCFGX ON.
  20722. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  20723. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  20724. C  AND VM INHIBITS. (SETS TO 1).
  20725.     INTEGER*4 FH
  20726. C FILE HANDLE FOR CONSOLE I/O (RAW)
  20727. C    COMMON/CONSFH/FH
  20728.     CHARACTER*1 ARGSTR(52,4)
  20729. C    COMMON/ARGSTR/ARGSTR
  20730.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IC1POS,IC2POS,MODFLG,
  20731.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  20732.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  20733.      3  IRCE2,FH,ARGSTR
  20734. C ***<<< XVXTCD COMMON END >>>***
  20735. CCC    InTeGer*4 IC1POS,IC2POS,MODFLG
  20736. CCC    COMMON/ICPOS/IC1POS,IC2POS,MODFLG
  20737. C CONTROLS TO SET VARIOUS VISUAL ATTRIBUTES
  20738. C NORMAL, BOLD
  20739.     InTeGer*4 N1SV,N2SV,N222
  20740.     CHARACTER*1 CLSV(8)
  20741. c        CHARACTER*1 ULIT(8)
  20742. c    CHARACTER*1 NORMIT(4)
  20743.     CHARACTER*1 OUTBUF(16)
  20744. C    CHARACTER*1 NORMIT(4),BOLDIT(8),OUTBUF(16),BOLDUL(10)
  20745.     CHARACTER*2 OBF3
  20746.     CHARACTER*3 OBF6
  20747.     EQUIVALENCE (OBF3,OUTBUF(3)),(OBF6,OUTBUF(6))
  20748.     InTeGer*4 COLSW
  20749. C COLOR SCHEME CODED DATA ABOVE...
  20750.     DATA N222/0/
  20751.     DATA COLSW/0/
  20752. C LEAVE IN THE BOLDING FOR NEGATIVE NUMBERS
  20753. c    DATA NORMIT/'^[','[','0','m'/
  20754. C SET ATTRIBUTE 4 (UNDERLINE) RATHER THAN 1 (BOLD) FOR ALTERNATE LINES.
  20755. c fill in initial escape character (27 decimal)
  20756.       OUTBUF ( 1 ) = Char(27)
  20757.       DO 20000  I = 2, 16
  20758. c fill in spaces in out buffer (32 decimal = ascii space)
  20759.       OUTBUF ( I ) = Char(32)
  20760. 20000 CONTINUE
  20761. 20001 CONTINUE
  20762. C CMD 20 TURNS COLOR ON, 21 TURNS IT OFF.
  20763.       IF ( CMD .NE. 1) GOTO 20002
  20764. C CURSOR POSITION.
  20765. C SHIP OUT APPROPRIATE CHARACTERISTICS.
  20766.  
  20767. 7701    CONTINUE
  20768. 1754    CONTINUE
  20769. 1500    CONTINUE
  20770. 7711    CONTINUE
  20771.       OUTBUF ( 2 ) = '['
  20772.       IF (.NOT.( N1 .GT. 0 . AND . N1 .LE. (LLDSP+1) )) GOTO 20004
  20773.        WRITE(OBF3(1:2),10,ERR=20004)N1
  20774. C      ENCODE ( 2, 10, OUTBUF ( 3 ) ) N1
  20775. 20004 CONTINUE
  20776.       OUTBUF ( 5 ) = ';'
  20777. C ALLOW WIDE DISPLAYS FOR MACHINES LIKE THE RAINBOW...
  20778. C NOTE: USES MSDOS FORTRAN V3.2 FEATURE OF  I3.3 FORMAT...
  20779.       IF (.NOT.( N2 .GT. 0 . AND . N2 .LT. 233)) GOTO 20006
  20780.        WRITE(OBF6(1:3),105,ERR=20006)N2
  20781. C      ENCODE ( 3, 105, OUTBUF ( 6 ) ) N2
  20782. C FIX THE ABOVE FOR 132 COLUMN MAX ON RAINBOW. NO NEED TO LIMIT TO 80 COLS ON
  20783. C MACHINES THAT CAN HANDLE 132 OR MORE, BUT IBM MAY GOOF UP UNLESS LIMIT IS
  20784. C IN EFFECT. (LOSE LOSE)
  20785.     IF(OUTBUF(4).EQ.' ')OUTBUF(4)='0'
  20786.     IF(OUTBUF(7).EQ.' ')OUTBUF(7)='0'
  20787.     IF(OUTBUF(3).EQ.' ')OUTBUF(3)='0'
  20788.     IF(OUTBUF(6).EQ.' ')OUTBUF(6)='0'
  20789. 20006 CONTINUE
  20790.       OUTBUF ( 9 ) = 'H'
  20791.       LEN = 9
  20792.       GOTO 20003
  20793. 20002 CONTINUE
  20794.       IF ( CMD .NE. 11 ) GOTO 20036
  20795. C ERASE DISPLAY
  20796. C ALWSAYS ERASE WHOLE DISPLAY HERE.
  20797.     OUTBUF(1)=27
  20798.     call swrt(outbuf,1)
  20799.     call swrt('[0;0H',5)
  20800.     call swrt(outbuf,1)
  20801.     CALL SWRT('[2J',3)
  20802.     RETURN
  20803. 20036 CONTINUE
  20804.       IF ( CMD .NE. 12 ) GOTO 20042
  20805. C ERASE LINE
  20806. C EITHER ERASE WHOLE LINE BY DOING CR FIRST, OR JUST END OF LINE
  20807. C IF HE USED CODE 2.
  20808. C CAN'T HANDLE ERASING START ONLY, BUT ANALYTICALC NEVER TRIES THIS.
  20809. C DO C.R. FIRST IF CALLED FOR
  20810. 22001    CONTINUE
  20811.     if(n1.EQ.2)goto 20044
  20812. cc just emit line
  20813.     outbuf(1)=27
  20814.     outbuf(2)='['
  20815.     outbuf(3)='K'
  20816.     len=3
  20817.     goto 20003
  20818. C ERASE ALL BY RETURN, ERASE SEQ
  20819. 20044    outbuf(1)=13
  20820.     outbuf(2)=27
  20821.     outbuf(3)='['
  20822.     outbuf(4)='K'
  20823.       LEN = 4
  20824.       GOTO 20003
  20825. 20042 CONTINUE
  20826.       IF ( CMD .NE. 13 ) GOTO 20048
  20827. C SET GRAPHICS RENDITION (7=REVERSE VIDEO, 0=NORMAL,4=UNDERSCORE,1=BOLD
  20828. C  5=BLINK) (PORTACALC CALLS WITH 0 OR 7 (VT100 W/O AVO))
  20829. C    IF(MODFLG.NE.1)GOTO 22002
  20830. 22002    CONTINUE
  20831.     OUTBUF(1)=27
  20832.     call swrt(outbuf,1)
  20833.     IF(N1.EQ.7)CALL SWRT('[7m',3)
  20834.     if(n1.ne.7)call swrt('[0m',3)
  20835.     return
  20836. 20048 CONTINUE
  20837. c      IF (.NOT.( CMD .EQ. 15 )) GOTO 20054
  20838. C SCS. IGNORE THIS ... NEVER REALLY USED.
  20839.     RETURN
  20840. 20003 CONTINUE
  20841. 20073 CONTINUE
  20842. C USE A FORTRAN WRITE SO THIS WILL WORK ON VAX OR PDP11 (OR WHATEVER...)
  20843. C  UNIT 6 MUST BE THE TERMINAL...
  20844.     CALL SWRT(OUTBUF,LEN)
  20845. 10    FORMAT ( I2 )
  20846. 105    FORMAT(I3.3)
  20847.       RETURN
  20848.       END
  20849. c -h- varout.for    Fri Aug 22 13:37:17 1986    
  20850.     SUBROUTINE VAROUT (INDXX,IX2)
  20851. C COPYRIGHT (C) 1983 GLENN EVERHART
  20852. C ALL RIGHTS RESERVED
  20853. C 60=MAX REAL ROWS
  20854. C 301=MAX REAL COLS
  20855. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  20856. C VBLS AND TYPE DIMENSIONED 60,301
  20857. C
  20858. C **************************************************
  20859. C *                                                *
  20860. C *       SUBROUTINE   VAROUT                      *
  20861. C *                                                *
  20862. C **************************************************
  20863. C
  20864. C
  20865. C
  20866. C  OUTPUTS THE VALUE OF THE VARIABLE POINTED TO BY INDXX.
  20867. c modified version - multiple precision calls diked out - gce
  20868. C
  20869. C  ASCII     A1 FORMAT UNLESS THE ASCII VALUE IS LESS THAN 32.
  20870. C            IN SUCH CASES, 32 IS ADDED TO THE VALUE AND THE
  20871. C            CHARACTER IS OUTPUT  SO THAT IT IS PRECEDED BY THE
  20872. C            CHARACTER '^'.
  20873. C
  20874. C  DECIMAL   A COMPUTED F FORMAT.
  20875. C
  20876. C  HEXADECIMAL  LEADING ZEROES, "BASE 16" QUE.
  20877. C
  20878. C  INTEGER   I12 FORMAT
  20879. C
  20880. C  OCTAL     LEADING ZEROES, "BASE 8" QUE
  20881. C
  20882. C  REAL      D25.18 FORMAT
  20883. C
  20884. C
  20885. C  VAROUT CALLS
  20886. C
  20887. C ERRMSG   PRINTS OUT ERROR MESSAGES
  20888. C MOUT     OUTPUTS MULTIPLE PRECISION NUMBERS
  20889. C
  20890. C
  20891. C
  20892. C
  20893. C
  20894. C VAROUT IS CALLED BY CALC AND POSTVL
  20895. C
  20896. C
  20897. C
  20898. C  VARIABLE   USE
  20899. C
  20900. C  DEC        HOLDS NUMBER OF DIGITS TO THE RIGHT OF THE
  20901. C             DECIMAL POINT IN F FORMAT SPECIFICATION.
  20902. C  DFORM(11)  HOLDS FORMAT SPECIFICATION FOR F FORMAT
  20903. C             (OUTPUTTING VALUE OF VARIABLES WITH DECIMAL DATA TYPE).
  20904. C  DIGITS     HOLDS THE ASCII CHARACTERS FOR VARIOUS DIGITS.
  20905. C  EIGHT(8)   USED TO PICK OFF REAL*8 'S FROM VBLS.
  20906. C             ALSO HOLDS HEXADECIMAL DIGITS IF # IS DATA TYPE HEX.
  20907. C  FOUR(4)    USED TO PICK OFF INTEGER*4'S FROM VBLS.
  20908. C  I,K        HOLDS TEMPORARY VALUES.
  20909. C  I1         HOLDS THE FIRST DIGIT IN CREATING AN F FORMAT SPECIFICATION.
  20910. C  I2         HOLDS THE SECOND DIGIT IN CREATING AN F FORMAT SPEC.
  20911. C  INDXX      POINTS TO VARIABLE BEING OUTPUT.
  20912. C  IPT        POINTER FOR DFORM.
  20913. C  ISV        POINTER FOR VECTOR SIGN(2).
  20914. C  ITWO       TWO IS USED TO PICK OFF A BYTE OF THE INTEGER
  20915. C  TWO(2)     REPRESENTATION. THEN ITWO IS USED AS
  20916. C             THE VALUE. THIS IS DONE BECAUSE OTHERWISE
  20917. C             SOME COMPILERS WOULD FORCE A SIGN EXTEND.
  20918. C  L          TEMPORARY VALUES. POINTER FOR EIGHT(8).
  20919. C  LEVIN(11)  HOLDS PRINTABLE ASCII CHARACTERS WHICH REPRESENT
  20920. C             AN OCTAL NUMBER. EQUIVALENCED WITH EIGHT(8).
  20921. C  M1         HOLDS HIGH ORDER HEXADECIMAL DIGIT.
  20922. C  M2         HOLDS LOW ORDER HEXADECIMAL DIGIT.
  20923. C  MAG        HOLDS THE MAGNITUDE OF A REAL*8 NUMBER
  20924. C  P10        REAL*8 THAT HOLDS POWERS OF 10. (DECIMAL)
  20925. C  RETCD      HOLDS RETURN CODE FROM CALL TO MOUT.
  20926. C  RPAR       ')'
  20927. C  SIGN(2)    HOLDS PRINTABLE ASCII CHARACTERS FOR OUTPUTTING THE
  20928. C             SIGN OF A NUMBER.
  20929. C  STAR1      HOLDS A SINGLE CHARACTER.
  20930. C  VBLS(100,27)  HOLDS VALUE FOR EACH VARIABLE.
  20931. C  WIDTH      WIDTH SPECIFICATION FOR F FORMAT.
  20932. C
  20933. C
  20934. C
  20935. C    SUBROUTINE VAROUT (INDXX,IX2)
  20936. C
  20937. C NOTE THAT VAROUT IS USED TO DUMP ONLY VALUES FROM AVBLS, NOT
  20938. C VBLS (IX2=1 ALWAYS AT CALLS). THUS DON'T BOTHER TO PICK UP
  20939. C ANY FURTHER INFO FROM VBLS HERE.
  20940.     REAL*8 REAL,MAG,P10
  20941. C
  20942.     INTEGER*4 INT,L,K
  20943. C
  20944.     InTeGer*4 ITWO,INDXX
  20945.     InTeGer*4 TYPE(1,1),WIDTH,DEC,VLEN(9),RETCD
  20946. C
  20947.     CHARACTER*1 AVBLS(20,27),STAR1,EIGHT(8),FOUR(4)
  20948.     CHARACTER*1 VBLS(8,1,1)
  20949.     CHARACTER*1 TWO(2)
  20950.     CHARACTER*1 DFORM(11),DIGITS(16,3),LEVIN(11)
  20951.     CHARACTER*11 DFORM1
  20952.     EQUIVALENCE(DFORM1(1:1),DFORM(1))
  20953.     CHARACTER*1 SIGN(2)
  20954.     CHARACTER*1 ALPHA(27),COMMA,BLANK,RPAR,LPAR,EQ
  20955. C ***<<< XVXTCD COMMON START >>>***
  20956.     CHARACTER*1 OARRY(100)
  20957.     InTeGer*4 OSWIT,OCNTR
  20958. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  20959. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  20960.     InTeGer*4 IPS1,IPS2,MODFLG
  20961. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  20962.        InTeGer*4 XTCFG,IPSET,XTNCNT
  20963.        CHARACTER*1 XTNCMD(80)
  20964. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  20965. C VARY FLAG ITERATION COUNT
  20966.     INTEGER KALKIT
  20967. C    COMMON/VARYIT/KALKIT
  20968.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  20969.     InTeGer*4 RCMODE,IRCE1,IRCE2
  20970. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  20971. C     1  IRCE2
  20972. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  20973. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  20974. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  20975. C RCFGX ON.
  20976. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  20977. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  20978. C  AND VM INHIBITS. (SETS TO 1).
  20979.     INTEGER*4 FH
  20980. C FILE HANDLE FOR CONSOLE I/O (RAW)
  20981. C    COMMON/CONSFH/FH
  20982.     CHARACTER*1 ARGSTR(52,4)
  20983. C    COMMON/ARGSTR/ARGSTR
  20984.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  20985.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  20986.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  20987.      3  IRCE2,FH,ARGSTR
  20988. C ***<<< XVXTCD COMMON END >>>***
  20989. CCC    InTeGer*4 OSWIT,OCNTR
  20990. C NOTE: OSWIT NONZERO MEANS OUTPUT TO OARRY.
  20991. C OSWIT=2 MEANS NO ZEROING OF OARRY; NOTHING MUCH COMES OUT.
  20992. CCC    CHARACTER*1 OARRY(100)
  20993. CCC    COMMON/OAR/OSWIT,OCNTR,OARRY
  20994. C
  20995.     COMMON /V/ TYPE,AVBLS,VBLS,VLEN
  20996.     COMMON /DIGV/ DIGITS
  20997.     COMMON /CONS/ ALPHA,COMMA,BLANK,RPAR,LPAR,EQ
  20998.     Character*127 cwrk
  20999.     Character*2 crlf
  21000. C
  21001.     EQUIVALENCE (TWO,ITWO)
  21002.     EQUIVALENCE (REAL,EIGHT),(INT,FOUR),(EIGHT,LEVIN)
  21003. C
  21004.     DATA SIGN/' ','-'/
  21005.     DATA DFORM /'(', '1', 'X', ',', 'F', ' ', ' ', '.', ' ', ' ',
  21006.      ;  ')'/
  21007.     DATA ITWO/0/
  21008. C
  21009. C
  21010. C
  21011.     crlf=char(13)//char(10)
  21012.     CALL TYPGET(INDXX,IX2,K)
  21013. C    K=TYPE(INDXX,IX2)
  21014.     IF (K.GT.0) GOTO 10
  21015. C MODIFY TO ELIMINATE CALL TO ERRMSG HERE. JUST COMPLAIN LOCALLY.
  21016.     CALL SWRT('Invalid type argument',21)
  21017.     oarry(1)=13
  21018.     oarry(2)=10
  21019.     call swrt(oarry,2)
  21020. C    CALL ERRMSG (16)
  21021.     GOTO 10000
  21022. 10    GOTO (100,200,300,400,500,600,700,800,900),K
  21023.     STOP 10
  21024. C
  21025. C
  21026. C
  21027. C
  21028. C **************************************************
  21029. C **************        ASCII        ***************
  21030. C **************************************************
  21031. 100    STAR1=AVBLS(1,INDXX)
  21032.     IF(OSWIT.NE.0)GOTO 6006
  21033.     IF (ICHAR(STAR1).LT.32) GOTO 110
  21034. 102    Continue
  21035. c    Rewind 11
  21036.     call vwrt(star1,1)
  21037. c    WRITE (11,103) STAR1
  21038. c    Rewind 11
  21039. 103    FORMAT (1X,A1)
  21040.     RETURN
  21041. 110    STAR1=CHAR(ICHAR(STAR1)+32)
  21042. c    Rewind 11
  21043.     Call vwrt('^' // star1,2)
  21044. c    WRITE (11,112) STAR1
  21045. c    Rewind 11
  21046. 112    FORMAT (1X,'^',A1)
  21047.     RETURN
  21048. 6006    OARRY(1)=STAR1
  21049.     OCNTR=1
  21050.     RETURN
  21051. C
  21052. C
  21053. C
  21054. C
  21055. C
  21056. C **************************************************
  21057. C ****************  DECIMAL   **********************
  21058. C **************************************************
  21059. 200    CONTINUE
  21060.     DO 208 I=1,8
  21061. 208    EIGHT(I)=AVBLS(I,INDXX)
  21062.     MAG=DABS(REAL)
  21063.     IF (MAG.LT.1.D0) GOTO 240
  21064. C
  21065. C
  21066. C COUNT THE # OF DIGITS TO THE LEFT OF THE DECIMAL POINT
  21067.     P10=1.D0
  21068.     DO 210 I=1,38
  21069.     P10=10.D0*P10
  21070.     IF (P10.GT.MAG) GOTO 212
  21071. 210    CONTINUE
  21072. C
  21073. C I COUNTS THE # OF DIGITS TO THE LEFT OF THE DECIMAL POINT
  21074.     I=39
  21075. 212    DEC=0
  21076.     WIDTH=17
  21077.     IF(I.GT.15)WIDTH=I+2
  21078.     IF(I.LE.15)DEC=15-I
  21079. C
  21080. C
  21081. C  CREATE PROPER FORMAT STATEMENT
  21082. 215    I1=WIDTH/10
  21083.     I2=WIDTH-I1*10
  21084.     IF (I2.EQ.0) I2=10
  21085.     DFORM(6)=DIGITS(I1,1)
  21086.     DFORM(7)=DIGITS(I2,1)
  21087.     I1=DEC/10
  21088.     I2=DEC-I1*10
  21089.     IF (I1.EQ.0) I1=10
  21090.     IF (I2.EQ.0) I2=10
  21091.     IPT=9
  21092.     IF (I1.EQ.0) GOTO 220
  21093.     DFORM(9)=DIGITS(I1,1)
  21094.     IPT=IPT+1
  21095. 220    DFORM(IPT)=DIGITS(I2,1)
  21096.     DFORM(IPT+1)=RPAR
  21097.     nnn=ipt+2
  21098.     if(nnn.ge.11)goto 223
  21099.     do 224 nnnn=nnn,11
  21100. 224    dform(nnnn)=' '
  21101. 223    continue
  21102. C
  21103. C
  21104. C
  21105. C
  21106. C  OUTPUT REAL USING NEWLY CREATED
  21107. C  FORMAT STATEMENT HELD BY DFORM
  21108.     IF(OSWIT.NE.0)GOTO 6009
  21109. c    Rewind 11
  21110.     write(cwrk,dform,err=10000)real
  21111.     call vwrt(crlf,2)
  21112.     call vwrt(cwrk,len(cwrk))
  21113. c    WRITE (11,DFORM,ERR=10000) REAL
  21114. c    Rewind 11
  21115.     GOTO 10000
  21116. 6009    CONTINUE
  21117.     IF(OSWIT.EQ.2) GOTO 6101
  21118.     IF(OSWIT.GT.3)GOTO 7101
  21119.     DO 6010 OCNTR=1,106
  21120. 6010    OARRY(OCNTR)=0
  21121. 6101    CONTINUE
  21122. C FORGET THE ENCODE ... NEVER USED
  21123. C6101    ENCODE(100,DFORM,OARRY)REAL
  21124. 7101    OCNTR=100
  21125.     GOTO 10000
  21126. C
  21127. C
  21128. C  REAL LESS THAN 1.D0
  21129. 240    P10=1.D0
  21130.     DO 245 I=1,38
  21131.     P10=P10*.1D0
  21132.     IF (MAG.GE.P10) GOTO 250
  21133. 245    CONTINUE
  21134.     I=0
  21135. C
  21136. C I-1 REPRESENTS THE NUMBER OF LEADING ZEROS
  21137. 250    DEC=14+I
  21138.     WIDTH=DEC+3
  21139.     GOTO 215
  21140. C
  21141. C
  21142. C **************************************************
  21143. C *************  HEXADECIMAL  **********************
  21144. C **************************************************
  21145. C  HEXADECIMAL
  21146. 300    CONTINUE
  21147.     DO 302 I=1,4
  21148. 302    FOUR(I)=AVBLS(I,INDXX)
  21149.     ISV=1
  21150.     IF (INT.LT.0) ISV=2
  21151.     INT=IABS(INT)
  21152.     L=8
  21153.     DO 304 I=1,4
  21154. C PICK UP A VALUE, THEN USE InTeGer*4 EQUIVALENT
  21155. C TO WORK WITH SO SIGN DOESN'T GET EXTENED.
  21156.     TWO(1)=ICHAR(FOUR(I))
  21157.     M1=ITWO/16
  21158.     M2=ITWO-M1*16
  21159.     IF(M1.EQ.0)M1=16
  21160.     IF(M2.EQ.0)M2=16
  21161.     EIGHT(L)=DIGITS(M2,3)
  21162.     L=L-1
  21163.     EIGHT(L)=DIGITS(M1,3)
  21164.     L=L-1
  21165. 304    CONTINUE
  21166.     IF(OSWIT.NE.0)GOTO 6011
  21167. c    Rewind 11
  21168.     write(cwrk,310,err=10000)sign(isv),eight
  21169.     call vwrt(crlf,2)
  21170.     Call vwrt(cwrk,len(cwrk))
  21171. c    WRITE (11,310,ERR=10000) SIGN(ISV), EIGHT
  21172. c    Rewind 11
  21173. 310    FORMAT (1X,1A1,8A1,2X,'(BASE 16)')
  21174.     GOTO 10000
  21175. 6011    CONTINUE
  21176.     IF(OSWIT.EQ.2)GOTO 6102
  21177.     IF(OSWIT.GT.3)GOTO 7102
  21178.     DO 6013 OCNTR=1,106
  21179. 6013    OARRY(OCNTR)=0
  21180. 6102    CONTINUE
  21181. C FORGET UNUSED ENCODE
  21182. C6102    ENCODE(8,6012,OARRY)SIGN(ISV),EIGHT
  21183. 6012    FORMAT(A1,8A1)
  21184. 7102    OCNTR=9
  21185.     GOTO 10000
  21186. C
  21187. C
  21188. C **************************************************
  21189. C ***************   INTEGER   **********************
  21190. C **************************************************
  21191. 400    DO 404 I=1,4
  21192. 404    FOUR(I)=AVBLS(I,INDXX)
  21193.     IF(OSWIT.NE.0)GOTO 6014
  21194. c    Rewind 11
  21195.     Write(cwrk,410,err=10000)int
  21196.     call vwrt(crlf,2)
  21197.     call vwrt(cwrk,len(cwrk))
  21198. c    WRITE (11,410,ERR=10000) INT
  21199. c    Rewind 11
  21200. 410    FORMAT (1X,I12)
  21201.     GOTO 10000
  21202. 6014    CONTINUE
  21203.     IF(OSWIT.EQ.2)GOTO 6103
  21204.     IF(OSWIT.GT.3)GOTO 7104
  21205.     DO 6015 OCNTR=1,106
  21206. 6015    OARRY(OCNTR)=0
  21207. 6103    CONTINUE
  21208. C6103    ENCODE(12,410,OARRY)INT
  21209. 7104    OCNTR=12
  21210.     GOTO 10000
  21211. C
  21212. C
  21213. C **************************************************
  21214. C ***********    MULTIPLE PRECISION   **************
  21215. C **************************************************
  21216. C  MULTIPLE PRECISION
  21217. C  M10
  21218. 500    CONTINUE
  21219. C
  21220. C  M8
  21221. 600    CONTINUE
  21222. C
  21223. C  M16
  21224. 700    continue
  21225. c700    CALL MOUT (INDXX,RETCD)
  21226.     GOTO 10000
  21227. C
  21228. C
  21229. C **************************************************
  21230. C ****************   OCTAL   ***********************
  21231. C **************************************************
  21232. C  OCTAL
  21233. 800    DO 804 I=1,4
  21234. 804    FOUR(I)=AVBLS(I,INDXX)
  21235.     ISV=1
  21236.     IF (INT.LT.0) ISV=2
  21237.     K=IABS(INT)
  21238.     DO 810 I=1,11
  21239.     L=K-K/8*8
  21240. C TAKE ABSOLUTE VALUE IN CASE FIRST IABS DIDN'T WORK ON -2**31
  21241.     L=IABS(L)
  21242.     IF(L.EQ.0)L=9
  21243.     LEVIN (12-I)=DIGITS(L,2)
  21244.     K=K/8
  21245. 810    CONTINUE
  21246.     IF(OSWIT.NE.0)GOTO 6016
  21247. c    Rewind 11
  21248.     write(cwrk,820,err=10000)sign(isv),levin
  21249.     call vwrt(crlf,2)
  21250.     call vwrt(cwrk,len(cwrk))
  21251. c    WRITE (11,820,ERR=10000) SIGN(ISV), LEVIN
  21252. c    Rewind 11
  21253. 820    FORMAT (1X,1A1,11A1,2X,'(BASE 8)')
  21254.     GOTO 10000
  21255. 6016    CONTINUE
  21256.     IF(OSWIT.EQ.2)GOTO 6100
  21257.     IF(OSWIT.GT.3)GOTO 7105
  21258.     DO 6018 OCNTR=1,106
  21259. 6018    OARRY(OCNTR)=0
  21260. 6100    CONTINUE
  21261. C6100    ENCODE(12,6017,OARRY)SIGN(ISV),LEVIN
  21262. 6017    FORMAT(12A1)
  21263. 7105    OCNTR=12
  21264.     GOTO 10000
  21265. C
  21266. C
  21267. C
  21268. C
  21269. C
  21270. C **************************************************
  21271. C ***************    REAL    ***********************
  21272. C **************************************************
  21273. 900    DO 904 I=1,8
  21274. 904    EIGHT(I)=AVBLS(I,INDXX)
  21275.     IF(OSWIT.NE.0)GOTO 6019
  21276. c    Rewind 11
  21277.     write(cwrk,910,err=10000)real
  21278.     call vwrt(crlf,2)
  21279.     call vwrt(cwrk,len(cwrk))
  21280. c    WRITE (11,910,ERR=10000) REAL
  21281. c    Rewind 11
  21282. 910    FORMAT (1X,D25.18)
  21283.     GOTO 10000
  21284. 6019    CONTINUE
  21285.     IF (OSWIT.EQ.2)GOTO 6020
  21286.     IF(OSWIT.GT.3)GOTO 7106
  21287.     DO 6321 OCNTR=1,106
  21288. 6321    OARRY(OCNTR)=Char(0)
  21289. 6020    CONTINUE
  21290. C    ENCODE(28,6021,OARRY)REAL
  21291. 6021    FORMAT(D25.18)
  21292. 7106    OCNTR=28
  21293. 10000    RETURN
  21294.     END
  21295. c -h- vblget.for    Fri Aug 22 13:37:17 1986    
  21296.         SUBROUTINE VBLGET(ID1,ID2,ID3,IVAL)
  21297. C
  21298. C VBLGET - GET BYTE OF 3 DIM VBLS ARRAY, ORIGINALLY
  21299. C  DIMENSIONED (8,60,301). HANDLE BY CALLING XVBLGT TO GET
  21300. C  CORRECT 8 BYTE VARIABLE, AND PULLING OUT CORRECT ONE
  21301.         InTeGer*4 ID1,ID2,ID3
  21302.         CHARACTER*1 IVAL,LL(8)
  21303.         REAL*8 XX
  21304.         EQUIVALENCE(LL(1),XX)
  21305.         CALL XVBLGT(ID2,ID3,XX)
  21306.         IVAL=LL(ID1)
  21307.         RETURN
  21308.         END
  21309. c -h- vblset.for    Fri Aug 22 13:37:17 1986    
  21310.         SUBROUTINE VBLSET(ID1,ID2,ID3,IVAL)
  21311. C VBLSET - SET BYTE OF 3 DIM VBLS ARRAY, ORIGINALLY
  21312. C  DIMENSIONED (8,60,301). HANDLE BY CALLING XVBLST TO GET
  21313. C  CORRECT 8 BYTE VARIABLE, AND PUTTING IN CORRECT ONE
  21314.         InTeGer*4 ID1,ID2,ID3
  21315.         CHARACTER*1 IVAL,LL(8)
  21316.         REAL*8 XX
  21317.         EQUIVALENCE(LL(1),XX)
  21318. C GET THE DESIRED 8 BYTES, THEN CHANGE THE ONE WE WANT. THEN...
  21319.         CALL XVBLGT(ID2,ID3,XX)
  21320.         LL(ID1)=IVAL
  21321. C PUT BACK THE 8 BYTES.
  21322.         CALL XVBLST(ID2,ID3,XX)
  21323.         RETURN
  21324.         END
  21325. c -h- wassig.fdd    Fri Aug 22 13:44:20 1986    
  21326.     SUBROUTINE WASSIG(IUNIT,NAME)
  21327. C
  21328. C
  21329.     CHARACTER*1 NAME(50)
  21330.     InTeGer*4 IUNIT
  21331.     CHARACTER*20 WK
  21332.     CHARACTER*1 WK1(20)
  21333.     EQUIVALENCE(WK(1:1),WK1(1))
  21334. C JUST TRY AND NULL FILL A NAME TO USE.
  21335.     DO 1 N=1,20
  21336.     WK1(N)=' '
  21337. 1    CONTINUE
  21338.     DO 2 N=1,20
  21339.     II=ICHAR(NAME(N))
  21340.     IF(II.LT.32)GOTO 3
  21341.     WK1(N)=CHAR(II)
  21342. C1    CONTINUE
  21343. 2    CONTINUE
  21344. 3    OPEN(IUNIT,FILE=WK(1:20),STATUS='NEW',
  21345.      1  ACCESS='SEQUENTIAL',FORM='FORMATTED')
  21346.     RETURN
  21347.     END
  21348. c -h- wrkfil.f40    Fri Aug 22 13:44:46 1986    
  21349.     SUBROUTINE WRKFIL(NREC,ARRAY,IFUNC)
  21350. C COPYRIGHT 1983 GLENN C.EVERHART
  21351. C ALL RIGHTS RESERVED
  21352. C WORKFILE PSEUDO-MAINTAINER
  21353. C
  21354. C THIS ROUTINE IS INTENDED TO PERMIT THE SCRATCH FILE OF
  21355. C PORTACALC TO BE DISPENSED WITH BY USING A LARGE IN-MEMORY
  21356. C ARRAY. A BITMAP WILL SET UP WHEN THE ELEMENT IS INIT'ED AND
  21357. C THE DEFAULT ELEMENT WILL BE COMPUTED AND RETURNED
  21358. C IF AN UNINITIALIZED ELEMENT IS USED.
  21359. C
  21360. c nrc was i*4. make it i*2 here
  21361.     Include Aparms.Inc
  21362.     INTEGER NRC
  21363. C    InTeGer*4 NRC2(2)
  21364. C    EQUIVALENCE(NRC2(1),NRC)
  21365. C RECORD NUMBER TO ACCESS
  21366.     INTEGER NREC
  21367.     CHARACTER*1 ARRAY(128)
  21368.     INTEGER IFUNC
  21369. C ***<<<< RDD COMMON START >>>***
  21370.     InTeGer*4 RRWACT,RCLACT
  21371. C    COMMON/RCLACT/RRWACT,RCLACT
  21372.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  21373.      1  IDOL7,IDOL8
  21374. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  21375. C     1  IDOL7,IDOL8
  21376.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  21377. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  21378.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  21379. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  21380. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  21381. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  21382.     InTeGer*4 KLVL
  21383. C    COMMON/KLVL/KLVL
  21384.     InTeGer*4 IOLVL,IGOLD
  21385. C    COMMON/IOLVL/IOLVL
  21386. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  21387. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  21388.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  21389.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  21390.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  21391.      3  k3dfg,kcdelt,krdelt,kpag
  21392. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  21393. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  21394. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  21395. C ***<<< RDD COMMON END >>>***
  21396. CCC    InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  21397. CCC    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  21398. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  21399. C
  21400. C ***<<< NULETC COMMON START >>>***
  21401.     InTeGer*4 ICREF,IRREF
  21402. C    COMMON/MIRROR/ICREF,IRREF
  21403.     InTeGer*4 MODPUB,LIMODE
  21404. C    COMMON/MODPUB/MODPUB,LIMODE
  21405.     InTeGer*4 KLKC,KLKR
  21406.     REAL*8 AACP,AACQ
  21407. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  21408.     InTeGer*4 NCEL,NXINI
  21409. C    COMMON/NCEL/NCEL,NXINI
  21410.     CHARACTER*1 NAMARY(20,MRows)
  21411. C    COMMON/NMNMNM/NAMARY
  21412.     InTeGer*4 NULAST,LFVD
  21413. C    COMMON/NULXXX/NULAST,LFVD
  21414.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  21415.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  21416. C ***<<< NULETC COMMON END >>>***
  21417. CCC    InTeGer*4 NCEL,NXINI
  21418. CCC    COMMON/NCEL/NCEL,NXINI
  21419.     InTeGer*4 MFID(2),MFMOD(2)
  21420.     InTeGer*2 IFID(8,MFrm)
  21421.     COMMON/IFIDC/IFID
  21422. CCC    InTeGer*4 RRWACT,RCLACT
  21423. C MFLAST = 1 OR 2 FOR LAST BUFFER USED. MFBASE IS HOLDER FOR "BASE ADDR"
  21424. C IN ARRAY TO USE IN SCANS.
  21425.     InTeGer*4 MFLAST,MFBASE,MVLAST,MVBASE
  21426.     COMMON/VBCTL/MFLAST,MFBASE,MVLASE,MVBASE
  21427. CCC    COMMON/RCLACT/RRWACT,RCLACT
  21428.     CHARACTER*1 LFID(16,MFrm)
  21429.     EQUIVALENCE(IFID(1,1),LFID(1,1))
  21430. C ***<<< KLSTO COMMON START >>>***
  21431.     InTeGer*4 DLFG
  21432. C    COMMON/DLFG/DLFG
  21433.     InTeGer*4 KDRW,KDCL
  21434. C    COMMON/DOT/KDRW,KDCL
  21435.     InTeGer*4 DTRENA
  21436. C    COMMON/DTRCMN/DTRENA
  21437.     REAL*8 EP,PV,FV
  21438.     DIMENSION EP(20)
  21439.     INTEGER*4 KIRR
  21440. C    COMMON/ERNPER/EP,PV,FV,KIRR
  21441.     InTeGer*4 LASTOP
  21442. C    COMMON/ERROR/LASTOP
  21443.     CHARACTER*1 FMTDAT(9,76)
  21444. C    COMMON/FMTBFR/FMTDAT
  21445.     CHARACTER*1 EDNAM(16)
  21446. C    COMMON/EDNAM/EDNAM
  21447. c    InTeGer*4 MFID(2),MFMOD(2)
  21448. C    COMMON/FRM/MFID,MFMOD
  21449.     InTeGer*4 JMVFG,JMVOLD
  21450. C    COMMON/FUBAR/JMVFG,JMVOLD
  21451.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  21452.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  21453. C ***<<< KLSTO COMMON END >>>***
  21454. CCC    COMMON/FRM/MFID,MFMOD
  21455.     CHARACTER*1 LI,IBYTE
  21456. C DEFFMT IS THE DEFAULT FORMAT FOR NUMERICS. INITIALLY IT WILL BE F9.2
  21457.     CHARACTER*1 DVFMT(12),DEFFMT(10)
  21458.     EQUIVALENCE(DVFMT(2),DEFFMT(1))
  21459.     COMMON/DEFVBX/DVFMT
  21460. C FORMAT BLOCK (ONE ONLY, 512 BYTES, BUT ORGANIZED AS 76 FORMAT
  21461. C AREAS WITH DATA.)
  21462. CCC    CHARACTER*1 FMTDAT(9,76)
  21463. CCC    COMMON/FMTBFR/FMTDAT
  21464. C
  21465. C IFUNC SPECIFIES WHAT TO DO:
  21466. C    =0    READ INTO ARRAY
  21467. C    =1    WRITE FROM ARRAY INTO WRKARY
  21468. C    =2    INITIALIZE (JUST CLEARS BITMAP HERE)(OPEN)
  21469. C    =3    CLOSE (CLEARS BITMAP HERE)
  21470.     CHARACTER*1 DTBL1(9,9,8)
  21471. C BIG WASTEFUL TABLE TO INIT OPERATION TYPE DATA. TRY TO REUSE SPACE.
  21472.     InTeGer*2 BTBL(6,6,8)
  21473. C REUSE SPACE BY MAKING LFID AND IT OVERLAY EACH OTHER.
  21474. C NO NEED TO WASTE IT.
  21475.     INTEGER DTBLIN
  21476. C DTBLIN FLAGS THAT DTBL1 WAS ALREADY INITED, SO ONLY DOES SO ONCE.
  21477.     EQUIVALENCE(LFID(1,1),BTBL(1,1,1))
  21478.     InTeGer*2 BTBL1(6,6)
  21479.     InTeGer*2 BTBL2(6,6),BTBL3(6,6),BTBL4(6,6),BTBL5(6,6)
  21480.     InTeGer*2 BTBL6(6,6),BTBL7(6,6),BTBL8(6,6)
  21481.     EQUIVALENCE(BTBL(1,1,1),BTBL1(1,1)),(BTBL(1,1,2),BTBL2(1,1))
  21482.     EQUIVALENCE(BTBL(1,1,3),BTBL3(1,1)),(BTBL(1,1,4),BTBL4(1,1))
  21483.     EQUIVALENCE(BTBL(1,1,5),BTBL5(1,1)),(BTBL(1,1,6),BTBL6(1,1))
  21484.     EQUIVALENCE(BTBL(1,1,7),BTBL7(1,1)),(BTBL(1,1,8),BTBL8(1,1))
  21485.     COMMON /DECIDE/ DTBL1
  21486.     DATA DTBLIN/0/
  21487.     IF(IFUNC.NE.50)GOTO 34
  21488.     IF(DTBLIN.NE.0)RETURN
  21489.     DTBLIN=1
  21490. C FLAG WE DID THIS INITIALIZATION ONCE. SINCE BUFFER IS CLEARED WE MUST
  21491. C *** NOT *** DO IT AGAIN.
  21492. C ONLY INIT DTBL1 ENTRIES NOT CORRESPONDING TO MULTIPLE PRECISION DATA
  21493. C TYPES (WHICH ARE NOT SUPPORTED HERE)
  21494. C CALL SEPARATE ROUTINE TO CLEAR OUT THIS STUFF ONE-TIME. OVERLAY SAME.
  21495. C NOTE LOTS OF SILLY ARGUMENTS TO SUBROUTINE SINCE MS FORTRAN DISALLOWS
  21496. C EQUIVALENCES TO DUMMY ARGUMENTS.
  21497.     CALL WTBINI(IFID,LPGMXF,BTBL1,BTBL2,BTBL3,BTBL4,BTBL5,BTBL6,
  21498.      1  BTBL7,BTBL8)
  21499. C
  21500. C14      CONTINUE
  21501. CC FILE IS NOW CLEARED
  21502.     RETURN
  21503. 34    IF(IFUNC.LT.0.OR.IFUNC.GT.3)RETURN
  21504.     JFUN=IFUNC+1
  21505.     GOTO (1000,2000,3000,4000),JFUN
  21506. 1000    CONTINUE
  21507. C READ
  21508.     CALL FVLDGT(NREC,1,IBYTE)
  21509.     IF(ICHAR(IBYTE).NE.0)GOTO 1001
  21510. C UNINITIALIZED ARRAY ELEMENT: SET IT UP.
  21511. C JUST LEAVES DUMMY CELL CONTENTS WHERE NOTHING IS REALLY INIT'D.
  21512.     DO 1003 N=1,128
  21513. 1003    ARRAY(N)=char(0)
  21514.     ARRAY(1)='P'
  21515.     ARRAY(2)='#'
  21516.     ARRAY(3)='0'
  21517.     ARRAY(5)='0'
  21518.     ARRAY(4)='#'
  21519.     ARRAY(118)=CHAR(15)
  21520. C NOTE ARRAY(119) (WHICH BECOMES FVLD) IS 0 TOO.
  21521.     DO 1004 N=1,9
  21522. 1004    ARRAY(N+119)=DEFFMT(N)
  21523. C RETURN THE DEFAULT FORMAT NOW.
  21524.     RETURN
  21525. 1001    CONTINUE
  21526. C HERE HAVE TO GET THE WHOLE THING REALLY
  21527.     DO 1053 N=1,128
  21528. 1053    ARRAY(N)=char(0)
  21529.     ARRAY(119)=IBYTE
  21530.     ARRAY(118)=CHAR(15)
  21531.     ARRAY(1)=char(48)
  21532. C LET ARRAY INITIALLY BE SET SENSIBLY..
  21533.     DO 1054 N=1,9
  21534. 1054    ARRAY(N+119)=DEFFMT(N)
  21535. C WE MAY MODIFY FORMAT LATER TOO...
  21536. C NOW HAVE A NON-DEFAULT ELEMENT TO READ... GO THROUGH SYMBOL TBL LOGIC
  21537. C FOR THESE, WE USE 16-BYTE "CELLS" WHICH HAVE THE FOLLOWING FORMAT:
  21538. C    ID    2 BYTES (CELL ADDRESS, MUST BE 1 OR MORE FOR VALID)
  21539. C    FLAG    1 BYTE  (TYPE OF CELL:
  21540. C                0 = UNUSED
  21541. C                1 = 1 OF 1 CELLS
  21542. C                2 = NONTERMINAL OF MORE THAN 1 CELL
  21543. C                3 = LAST OF >1 CELLS
  21544. C    FORMAT    1 BYTE  (INDEX OF FORMAT STRING FOR THIS CELL; FORMATS
  21545. C                ARE STORED RESIDENT, UP TO 76 OF THEM,
  21546. C                SET BY DF COMMAND.)
  21547. C    FORMULA    12 BYTES  (FORMULA TEXT)
  21548. C SET UP HASH CODE NOW FOR THE WAY WE NEED...
  21549. C    IPM=(LPGMXF*64/2048)+1
  21550. C    IBF=64
  21551. CC    IBF=(2048+31)/32
  21552. C IBF IS NO. OF ENTRIES IN A BUFFER. OF 512 BYTES
  21553. C    IBF=32
  21554.     IBF=(MFrm+31)/64
  21555. C    LLL=(LPGMXF)/IBF
  21556. C    LLL=LPGMXF
  21557. C IPM IS NO. PAGES MAX IN FILS
  21558. C 1024 bytes holds 64 entries at 16 bytes each
  21559. C (user specifies file in K)
  21560. C handle in 1024 units since we have 2 buffers
  21561.     IPM=LPGMXF*64/(MFrmo2)
  21562. C EACH BUFFER HAS 16KB (if mfrm=2048) SO MAX PAGES IS (FILE LENGTH)/16
  21563. C    IPM=LLL
  21564.     IF(IPM.LT.2)IPM=2
  21565. C FORCE IPM (MAX MEM PAGE) TO BE IN VALID RANGE
  21566.     IHASH=NREC
  21567. C    JHASH=IMASK(IHASH,(MFrm-1))
  21568.     JHASH=MOD(IHASH,(MFrmo2))
  21569. C    JHASH=IMASK(IHASH,1023)
  21570. C    JHASH=MOD(IHASH,2048)
  21571.     IF(LPGMOD.NE.0)GOTO 5305
  21572. C    IPAG=(IHASH/2048)+1
  21573.     IPAG=(IHASH/(MFrmo2))+1
  21574.     IPAG=MOD(IPAG,IPM)+1
  21575.     GOTO 5306
  21576. 5305    CONTINUE
  21577. C SPEED OPTIMAL PACK
  21578.     FPG=FLOAT(IHASH)*FLOAT(IPM)/FLOAT(LPGMOD)
  21579.     IPAG=FPG
  21580.     IPAG=MOD(IPAG,IPM)
  21581.     IPAG=IPAG+1
  21582. C    IPAG=1+(IHASH*IPM)/18060
  21583. 5306    CONTINUE
  21584. C HERE DECIDED IF PAGE IS WHAT WE NEED.
  21585. C
  21586. C    IF(IPAG.LE.0)IPAG=1
  21587. C DETERMINE FIRST THAT NEITHER PAGE NUMBER IS ZERO.
  21588.     IF(IPAG.EQ.MFID(1).OR.IPAG.EQ.MFID(2))GOTO 853
  21589.     IF(MFID(1).NE.0)GOTO 852
  21590.     MFID(1)=IPAG
  21591.     GOTO 853
  21592. 852    IF(MFID(2).EQ.0)MFID(2)=IPAG
  21593. 853    CONTINUE
  21594.     IF(MFID(1).EQ.IPAG) GOTO 850
  21595.     IF(MFID(2).EQ.IPAG)GOTO 851
  21596.     GOTO 854
  21597. 850    CONTINUE
  21598. C PAGE 1 IS THE ONE WE NEED.
  21599.     MFLAST=1
  21600.     MFBASE=0
  21601.     GOTO 1400
  21602. 851    CONTINUE
  21603. C NEED SECOND PAGE
  21604.     MFLAST=2
  21605.     MFBASE=(MFrmo2)
  21606. C BASE IS HASFWAY ALONG FILE...
  21607.     GOTO 1400
  21608. 854    CONTINUE
  21609. C HERE FIGURE OUT WHICH BUFFER IS TO BE REPLACED.
  21610. C MFLAST will be either 1 or 2; following logic swaps them.
  21611.     MFLAST=3-MFLAST
  21612.     MFBASE=(MFrmo2)-MFBASE
  21613. C SIMILAR LOGIC SAYS MFBAS4E IS EITHER 0 OR MFrmo2. INITIALIZED IN
  21614. C WSSET TO 0.
  21615. C NOTE THAT IF MFLAST=1,MBFN=1 AND IF MFLAST=2,NEW MFLAST=1
  21616. C THIS GIVES BUFFER TO REPLACE... (LRU)
  21617. C
  21618. C IF MFLAST=2 REPLACE BUFFER 1, ELSE REPLACE BUFFER 0
  21619. C NOW MFID HAS MEMORY PAGE CURRENTLY PRESENT, IPAG IS DESIRED ONE FOR THIS
  21620. C FORMULA. NOTE WHILE WE USE A HASHCODE TO SEARCH FOR FORMULAS, ALL SEGMENTS
  21621. C OF A FORMULA MUST BE PLACED IN ONE MEMORY PAGE. THUS, IT IS POSSIBLE TO
  21622. C RUN OUT OF SPACE IF THE MEMORY BUFFER GETS TOO SMALL. CURRENT HASH
  21623. C CODE TRIES TO SPREAD THE FORMULAS OUT, BUT BIG MEMORY BUFFERS ALWAYS
  21624. C WIN.....
  21625.     IF(LPGMXF.LE.(MFro64))GOTO 1400
  21626. C    IF(LPGMXF.LE.(2048/64))GOTO 1400
  21627. C WRITE WHATEVER'S IN MEMORY TO FILE AND READ THE NEW PAGE IN.
  21628. C    IBF=32
  21629. CC    IBF=(1024+31)/32
  21630. C    IF(IBF.LT.1)IBF=1
  21631. C IBF IS BLK FACTOR FOR ONE WRITE
  21632. C WRITE 512 BYTES AT A TIME.
  21633.     L=1+MFBASE
  21634.     LLBK=(MFID(MFLAST)-1)*IBF+1
  21635.     LHBK=MFID(MFLAST)*IBF
  21636.     DO 1170 N=LLBK,LHBK
  21637.     IF(MFMOD(MFLAST).EQ.0)GOTO 1170
  21638.     LL=L+(MFro64)-1
  21639.     WRITE(7,REC=N,ERR=1170)((IFID(K,KK),K=1,8),KK=L,LL)
  21640.     L=L+(MFro64)
  21641. 1170    CONTINUE
  21642. C NOW READ IN THE DATA
  21643.     MFMOD(MFLAST)=0
  21644. C MARK PAGE UNTOUCHED. READING DOES NOT ALTER DATA SO NO NEED
  21645. C TO WRITE OUT UNLESS MODIFIED.
  21646.     MFID(MFLAST)=IPAG
  21647.     L=1+MFBASE
  21648.     LLBK=(MFID(MFLAST)-1)*IBF+1
  21649.     LHBK=MFID(MFLAST)*IBF
  21650.     DO 1171 N=LLBK,LHBK
  21651.     LL=L+(MFro64)-1
  21652.     READ(7,REC=N,ERR=1171)((IFID(K,KK),K=1,8),KK=L,LL)
  21653.     L=L+(MFro64)
  21654. 1171    CONTINUE
  21655. C DATA ALL SHOULD BE THERE NOW... OK, GO AHEAD.
  21656. 1400    CONTINUE
  21657. C NOW HAVE THE DESIRED MEMORY PAGE; READ THE FORMULA INTO ARRAY
  21658. C BUFFER.
  21659.     IARSUB=1
  21660. C FOR SIMPLICITY FORGET THE HASHCODE WITHIN MEMORY BUFFERS, JUST SEARCH
  21661. C FROM START...
  21662.     IFLAG=0
  21663.     IFMT=0
  21664.     DO 2500 NN=1,(MFrmo2)
  21665. c    N=MOD((NN+JHASH-1),(MFrmo2))
  21666.     N=MOD((NN+JHASH),(MFrmo2))
  21667.     N=N+1+MFBASE
  21668. C    N=IMASK((NN+JHASH-1),1023)+1+MFBASE
  21669.     KKKKK=IFID(1,N)
  21670.     IF(NN.GT.2.AND.KKKKK.EQ.-1)GOTO 2505
  21671.     IF(KKKKK.NE.NREC)GOTO 2500
  21672.     IFLAG=ICHAR(LFID(3,N))
  21673.     IF(IFMT.EQ.0)IFMT=ICHAR(LFID(4,N))
  21674. C for the moment leave this in. LAter remove and change to 10
  21675. C bytes formula, 4 bytes cell ID.
  21676.     DO 2502 K=1,12
  21677.     LI=LFID(K+4,N)
  21678. C COPY FORMULA TEXT INTO ARRAY. END ON NULLS...
  21679.     IF(ICHAR(LI).LE.0)GOTO 2505
  21680.     ARRAY(IARSUB)=LI
  21681. c null out following characters since -1's could be misinterpreted as data
  21682.     array(iarsub+1)=0
  21683.     array(iarsub+2)=0
  21684.     IARSUB=IARSUB+1
  21685. 2502    CONTINUE
  21686.     IF(IFLAG.EQ.1.OR.IFLAG.EQ.3)GOTO 2505
  21687. 2500    CONTINUE
  21688. 2505    CONTINUE
  21689. C GET FORMAT NOW...
  21690.     IF(IFMT.LE.0)RETURN
  21691.     DO 2510 N=1,9
  21692. 2510    ARRAY(119+N)=FMTDAT(N,IFMT)
  21693.     GOTO 5000
  21694. 2000    CONTINUE
  21695. C WRITE
  21696. C NOW SET INIT'D BIT; WRITE ARRAY ELEMENT OUT.
  21697. C FIRST FIND FORMAT AREA OR SET IT UP.
  21698.     IFMT=0
  21699.     LFF=0
  21700. C FAKE OUT THE SAVING OF FVLD INFO IN THIS ARRAY TOO.
  21701. C THIS IS INCOMPLETE AND NO LITTLE OF A KLUDGE BUT THE CODE WILL
  21702. C GENERALLY SET THEM TOGETHER, AND THIS GUARANTEES THAT IF
  21703. C FURTHER SETS TRY TO SET FVLD TO ARRAY(119), THEY'LL WORK AS
  21704. C THEY SHOULD.
  21705. C HERE SET MAX ARRAY ELEMENTS USED
  21706. C EXPECT (ID2-1)*60+ID1
  21707. C ID1 IS 60 DIM, ID2 IS 301 DIM
  21708. C    NRC2(2)=0
  21709. C    NRC2(1)=NREC
  21710. C JUST EQUATE NRC TO NREC
  21711. C ALLOW LATER FOR OVER 32768 ELEMENTS... NO NEED TO JUST YET
  21712. C WHEN WE DO, REPLACE NRC2 STUFF (WHOSE PURPOSE IS TO AVOID
  21713. C SIGN EXTENSIONS).
  21714. C NEXT KEEP TRACK OF LOWER RIGHT CORNER OF AREA IN USE.
  21715.     NRC=NREC-1
  21716.     IRUSED=MOD(NRC,MCols)+1
  21717.     ICUSED=((NRC-IRUSED+1)/MCols)+1
  21718.     IF(ICUSED.GT.RCLACT)RCLACT=ICUSED
  21719.     IF(IRUSED.GT.RRWACT)RRWACT=IRUSED
  21720. C SET RRWACT, RCLACT
  21721.     IF(ICHAR(ARRAY(119)).NE.0)CALL FVLDST(NREC,1,ARRAY(119))
  21722.     DO 2011 N=1,76
  21723.     IF(ICHAR(FMTDAT(1,N)).LE.0.AND.LFF.EQ.0)LFF=N
  21724. C SAVE FIRST FREE FORMAT AREA IN CASE THIS IS A NEW FORMAT...
  21725.     DO 2010 M=1,9
  21726.     IF(ARRAY(M+119).NE.FMTDAT(M,N))GOTO 2011
  21727. 2010    CONTINUE
  21728.     IFMT=N
  21729.     GOTO 2012
  21730. 2011    CONTINUE
  21731. C ON FALL THROUGH, WE FOUND NOTHING FOR IT...
  21732. C USE HIS FORMAT UNLESS WE HAVE NO ROOM, IN WHICH CASE USE LAST AREA
  21733.     IF(LFF.EQ.0)LFF=76
  21734.     IFMT=LFF
  21735.     DO 2013 N=1,9
  21736. 2013    FMTDAT(N,LFF)=ARRAY(119+N)
  21737. C SAVE FORMAT DATA WE NOW POINT TO...
  21738. 2012    CONTINUE
  21739. C NOW THE HARDER PART... MUST WRITE THE ARRAY'S FORMULA TOO...
  21740. C    IPM=(LPGMXF*64/2048)+1
  21741.     IBF=(MFro64)
  21742. C    IBF=(2048+31)/32/2
  21743. C    LLL=(LPGMXF*2)/IBF
  21744. C    IPM=LLL
  21745.     IPM=LPGMXF*64/MFrmo2
  21746. C IPM = NO. PAGES IN FILE. LPGMXF/(LENGTH OF ONE MEM BUFFER IN K).
  21747.     IF(IPM.LT.2)IPM=2
  21748. C FORCE IPM (MAX MEM PAGE) TO BE IN VALID RANGE
  21749.     IHASH=NREC
  21750. C    JHASH=IMASK(IHASH,1023)
  21751.     JHASH=MOD(IHASH,(MFrmo2))
  21752.     IF(LPGMOD.NE.0)GOTO 5307
  21753.     IPAG=(IHASH/(MFrmo2))+1
  21754.     IPAG=MOD(IPAG,IPM)+1
  21755.     GOTO 5308
  21756. 5307    CONTINUE
  21757. C SPEED OPTIMAL PACK
  21758.     FPG=FLOAT(IHASH)*FLOAT(IPM)/FLOAT(LPGMOD)
  21759.     IPAG=FPG
  21760.     IPAG=MOD(IPAG,IPM)
  21761.     IPAG=IPAG+1
  21762. C    IPAG=1+(IHASH*IPM)/18060
  21763. 5308    CONTINUE
  21764. C ***
  21765. C DETERMINE FIRST THAT NEITHER PAGE NUMBER IS ZERO.
  21766.     IF(IPAG.EQ.MFID(1).OR.IPAG.EQ.MFID(2))GOTO 953
  21767.     IF(MFID(1).NE.0)GOTO 952
  21768.     MFID(1)=IPAG
  21769.     GOTO 953
  21770. 952    IF(MFID(2).EQ.0)MFID(2)=IPAG
  21771. 953    CONTINUE
  21772.     IF(MFID(2).EQ.IPAG)GOTO 951
  21773.     IF(MFID(1).NE.IPAG) GOTO 954
  21774. 950    CONTINUE
  21775. C PAGE 1 IS THE ONE WE NEED.
  21776.     MFLAST=1
  21777.     MFBASE=0
  21778.     GOTO 2400
  21779. 951    CONTINUE
  21780. C NEED SECOND PAGE
  21781.     MFLAST=2
  21782.     MFBASE=(MFrmo2)
  21783. C BASE IS HASFWAY ALONG FILE...
  21784.     GOTO 2400
  21785. 954    CONTINUE
  21786. C HERE FIGURE OUT WHICH BUFFER IS TO BE REPLACED.
  21787.     MFLAST=3-MFLAST
  21788.     MFBASE=(MFrmo2)-MFBASE
  21789. C ***
  21790. C NOW MFID HAS MEMORY PAGE CURRENTLY PRESENT, IPAG IS DESIRED ONE FOR THIS
  21791. C FORMULA. NOTE WHILE WE USE A HASHCODE TO SEARCH FOR FORMULAS, ALL SEGMENTS
  21792. C OF A FORMULA MUST BE PLACED IN ONE MEMORY PAGE. THUS, IT IS POSSIBLE TO
  21793. C RUN OUT OF SPACE IF THE MEMORY BUFFER GETS TOO SMALL. CURRENT HASH
  21794. C CODE TRIES TO SPREAD THE FORMULAS OUT, BUT BIG MEMORY BUFFERS ALWAYS
  21795. C WIN.....
  21796.     IF(LPGMXF.LE.(MFro64))GOTO 2400
  21797. C WRITE WHATEVER'S IN MEMORY TO FILE AND READ THE NEW PAGE IN.
  21798. C    IBF=(1024+31)/32
  21799. C    IBF=32
  21800. C IBF IS BLK FACTOR
  21801.     L=1+MFBASE
  21802.     LLBK=(MFID(MFLAST)-1)*IBF+1
  21803.     LHBK=MFID(MFLAST)*IBF
  21804.     DO 2170 N=LLBK,LHBK
  21805.     IF(MFMOD(MFLAST).EQ.0)GOTO 2170
  21806.     LL=L+(MFro64)-1
  21807.     WRITE(7,REC=N,ERR=2170)((IFID(K,KK),K=1,8),KK=L,LL)
  21808.     L=L+(MFro64)
  21809. 2170    CONTINUE
  21810. C NOW READ IN THE DATA
  21811. C MARK NEW PAGE TOUCHED SINCE WE WILL DO SO HERE
  21812. C    MFMOD=1
  21813.     MFID(MFLAST)=IPAG
  21814.     L=1+MFBASE
  21815.     LLBK=(MFID(MFLAST)-1)*IBF+1
  21816.     LHBK=MFID(MFLAST)*IBF
  21817.     DO 2171 N=LLBK,LHBK
  21818.     LL=L+(MFro64)-1
  21819.     READ(7,REC=N,ERR=2171)((IFID(K,KK),K=1,8),KK=L,LL)
  21820.     L=L+(MFro64)
  21821. 2171    CONTINUE
  21822. C DATA ALL SHOULD BE THERE NOW... OK, GO AHEAD.
  21823. 2400    CONTINUE
  21824. C NOW HAVE THE DESIRED MEMORY PAGE; READ THE FORMULA INTO ARRAY
  21825. C BUFFER.
  21826.     MFMOD(MFLAST)=1
  21827.     IARSUB=1
  21828. C FOR SIMPLICITY FORGET THE HASHCODE WITHIN MEMORY BUFFERS, JUST SEARCH
  21829. C FROM START...
  21830. C OMIT THE ZEROING WHEN READING IN FROM FILE EXCEPT IN /MERGE MODE
  21831.     IF(NXINI.NE.0)GOTO 6233
  21832.     DO 1490 NN=1,(MFrmo2)
  21833.     N=MOD((NN+JHASH),(MFrmo2))+1+MFBASE
  21834. C    N=IMASK((NN+JHASH),1023)+1+MFBASE
  21835.     KKKKK=IFID(1,N)
  21836.     IF(NN.GT.2.AND.KKKKK.EQ.-1)GOTO 6233
  21837. C SKIP ZEROING ONCE WE ENCOUNTER A VIRGIN CELL SINCE WE WOULD ALWAYS
  21838. C CLEAR TO NONVIRGIN STATUS AFTERWARDS.
  21839.     IF(KKKKK.NE.NREC)GOTO 1490
  21840. C ZERO OLD RECORDS OF THIS ONE...
  21841.     NCEL=NCEL-1
  21842.     IF(NCEL.LT.0)NCEL=0
  21843.     DO 1498 KK=1,8
  21844. 1498    IFID(KK,N)=0
  21845. 1490    CONTINUE
  21846. 6233    CONTINUE
  21847.     IFLAG=0
  21848.     DO 1500 NN=1,(MFrmo2)
  21849.     N=MOD((NN+JHASH),(MFrmo2))+1+MFBASE
  21850. C    N=IMASK((NN+JHASH),1023)+1+MFBASE
  21851.     KKKKK=IFID(1,N)
  21852.     IF(KKKKK.NE.-1.AND.KKKKK.NE.0
  21853.      1     .AND.KKKKK.NE.NREC)GOTO 1500
  21854. C FOUND A NULL NODE...
  21855. C FILL IT IN NOW.
  21856.     NCEL=NCEL+1
  21857.     IFID(1,N)=NREC
  21858.     IFLAG=1
  21859.     LFID(4,N)=CHAR(IFMT)
  21860.     LFID(3,N)=CHAR(IFLAG)
  21861. c zero new elements to ensure no extra -1's get handled as
  21862. c data. Important because they could be mistaken for cell codings now.
  21863.     do 4502 k=1,12
  21864. 4502    lfid(k+4,n)=CHAR(0)
  21865.     DO 1502 K=1,12
  21866.     LI=ARRAY(IARSUB)
  21867.     IF(ICHAR(LI).LE.0)GOTO 1505
  21868. C CHOP IT OFF AT 109 ALSO...
  21869.     IF(IARSUB.GT.109)GOTO 1560
  21870.     LFID(K+4,N)=LI
  21871.     IARSUB=IARSUB+1
  21872. 1502    CONTINUE
  21873. C NONTERMINAL COPY...NEED ANOTHER CELL. FIRST TEST FOR EXACT FIT,
  21874. C HOWEVER.
  21875.     IF(ICHAR(ARRAY(IARSUB)).LE.0)GOTO 1560
  21876.     IFLAG=2
  21877.     LFID(3,N)=CHAR(IFLAG)
  21878. C NOW GO GET MORE SPACE FOR NEXT NODE.
  21879. C NOTE IT COULD RUN OUT, BUT JUST PUNT THAT.
  21880.     GOTO 1500
  21881. 1560    CONTINUE
  21882.     IF(IFLAG.EQ.1)IFLAG=3
  21883.     LFID(3,N)=CHAR(IFLAG)
  21884. C SETS UP EITHER 1 OR 3 FOR TERMINAL NODES
  21885.     GOTO 1505
  21886. C ESCAPE FROM LOOP ON ENDS...
  21887. 1500    CONTINUE
  21888. C HERE WE RAN OUT OF ROOM. TOO BAD...CAN'T REALLY HELP IT OR
  21889. C DO MUCH. JUST FORGET IT.
  21890. C HOWEVER, PRINT A MESSAGE ON SCREEN AT LEAST...
  21891.     CALL UVT100(1,1,1)
  21892.     CALL SWRT('Formula file overflowed. Try larger file.',41)
  21893. 1505    CONTINUE
  21894. C DONE NOW.
  21895.     GOTO 5000
  21896. 3000    CONTINUE
  21897. C OPEN (CLR BITMAP)
  21898.     MFID(1)=0
  21899.     MFID(2)=0
  21900.     MFBASE=0
  21901.     MFLAST=1
  21902.     GOTO 5000
  21903. 4000    CONTINUE
  21904. C CLOSE (CLR BITMAP)
  21905.     CLOSE(7,STATUS='DELETE')
  21906.     MFBASE=0
  21907.     MFLAST=1
  21908.     MFID(1)=0
  21909.     MFID(2)=0
  21910. 5000    RETURN
  21911.     END
  21912. c -h- xvblgt.f40    Fri Aug 22 13:45:23 1986    
  21913.         SUBROUTINE XVBLGT(ID1,ID2,XX)
  21914. C
  21915. C XVBLGT - LOAD 8 BYTES GIVEN DIMENSIONS FOR GETTING THEM
  21916. C 2 DIM ARRAY, DIM'D (60,301)
  21917.     Include AParms.Inc
  21918.         InTeGer*4 ID1,ID2
  21919.         REAL*8 XX
  21920.     InTeGer*4 TYPE(1,1),VLEN(9)
  21921.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1),VT(8)
  21922.     REAL*8 XXV(1,1),XVT
  21923.     EQUIVALENCE(XVT,VT(1))
  21924.     EQUIVALENCE(XXV(1,1),VBLS(1,1,1))
  21925.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  21926.     InTeGer*4 MFLAST,MFBASE,MVLAST,MVBASE
  21927.     COMMON/VBCTL/MFLAST,MFBASE,MVLAST,MVBASE
  21928. C ***<<<< RDD COMMON START >>>***
  21929.     InTeGer*4 RRWACT,RCLACT
  21930. C    COMMON/RCLACT/RRWACT,RCLACT
  21931.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  21932.      1  IDOL7,IDOL8
  21933. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  21934. C     1  IDOL7,IDOL8
  21935.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  21936. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  21937.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  21938. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  21939. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  21940. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  21941.     InTeGer*4 KLVL
  21942. C    COMMON/KLVL/KLVL
  21943.     InTeGer*4 IOLVL,IGOLD
  21944. C    COMMON/IOLVL/IOLVL
  21945. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  21946. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  21947.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  21948.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  21949.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  21950.      3  k3dfg,kcdelt,krdelt,kpag
  21951. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  21952. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  21953. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  21954. C ***<<< RDD COMMON END >>>***
  21955. CCC        InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  21956. CCC        COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  21957. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  21958. C NEXT BITMAPS IMPLEMENT FVLD
  21959.         CHARACTER*1 FV1(IMP1S),FV2(Imp1s),FV4(Imp1s)
  21960.     CHARACTER*1 FVXX(Imps3)
  21961.     EQUIVALENCE (FV1(1),FVXX(1)),(FV2(1),FVXX(Imp2s))
  21962.     EQUIVALENCE (FV4(1),FVXX(Imp3s))
  21963.         Common/FVLDM/FVXX
  21964. c        COMMON/FVLDM/FV1,FV2,FV4
  21965.         CHARACTER*1 LBITS(8)
  21966.         COMMON/BITS/LBITS
  21967. C THE FOLLOWING BITMAP IS FOR TYPE ARRAY, AND INTEGER ARRAY IS FOR
  21968. C TYPES OF AC'S STORAGE:
  21969.         CHARACTER*1 ITYP(Imp1s),LWK
  21970.         InTeGer*4 IATYP(27)
  21971.     INTEGER*2 LL(4)
  21972.     REAL*8 XA
  21973.     EQUIVALENCE(LL(1),XA)
  21974.         COMMON/TYP/IATYP,ITYP
  21975. C ***<<< NULETC COMMON START >>>***
  21976.     InTeGer*4 ICREF,IRREF
  21977. C    COMMON/MIRROR/ICREF,IRREF
  21978.     InTeGer*4 MODPUB,LIMODE
  21979. C    COMMON/MODPUB/MODPUB,LIMODE
  21980.     InTeGer*4 KLKC,KLKR
  21981.     REAL*8 AACP,AACQ
  21982. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  21983.     InTeGer*4 NCEL,NXINI
  21984. C    COMMON/NCEL/NCEL,NXINI
  21985.     CHARACTER*1 NAMARY(20,MRows)
  21986. C    COMMON/NMNMNM/NAMARY
  21987.     InTeGer*4 NULAST,LFVD
  21988. C    COMMON/NULXXX/NULAST,LFVD
  21989.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  21990.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  21991. C ***<<< NULETC COMMON END >>>***
  21992. CCC    InTeGer*4 ICREF,IRREF
  21993. CCC    COMMON/MIRROR/ICREF,IRREF
  21994.         InTeGer*2 LVALBF(5,MVal)
  21995.         InTeGer*4 MPAG(2),MPMOD(2)
  21996.         COMMON/VB/MPAG,LVALBF,MPMOD
  21997. C
  21998. C NEXT ARE BUFFERS FOR HOLDING VALUES, AND MEMORY OCCUPANCY WORDS
  21999. C FOR EACH GIVING THE BLK # IN USE FOR THESE TABLES
  22000. C FORMAT BLOCK (ONE ONLY, 512 BYTES, BUT ORGANIZED AS 76 FORMAT
  22001. C AREAS WITH DATA.
  22002. C ***<<< KLSTO COMMON START >>>***
  22003.     InTeGer*4 DLFG
  22004. C    COMMON/DLFG/DLFG
  22005.     InTeGer*4 KDRW,KDCL
  22006. C    COMMON/DOT/KDRW,KDCL
  22007.     InTeGer*4 DTRENA
  22008. C    COMMON/DTRCMN/DTRENA
  22009.     REAL*8 EP,PV,FV
  22010.     DIMENSION EP(20)
  22011.     INTEGER*4 KIRR
  22012. C    COMMON/ERNPER/EP,PV,FV,KIRR
  22013.     InTeGer*4 LASTOP
  22014. C    COMMON/ERROR/LASTOP
  22015.     CHARACTER*1 FMTDAT(9,76)
  22016. C    COMMON/FMTBFR/FMTDAT
  22017.     CHARACTER*1 EDNAM(16)
  22018. C    COMMON/EDNAM/EDNAM
  22019.     InTeGer*4 MFID(2),MFMOD(2)
  22020. C    COMMON/FRM/MFID,MFMOD
  22021.     InTeGer*4 JMVFG,JMVOLD
  22022. C    COMMON/FUBAR/JMVFG,JMVOLD
  22023.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  22024.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  22025. C ***<<< KLSTO COMMON END >>>***
  22026. CCC        CHARACTER*1 FMTDAT(9,76)
  22027. CCC        COMMON/FMTBFR/FMTDAT
  22028.     IF(ID1.GT.27.OR.ID2.GT.1)GOTO 7800
  22029. C AN ACCUMULATOR. GET IT.
  22030.     DO 7801 IV=1,8
  22031. 7801    VT(IV)=AVBLS(IV,ID1)
  22032.     XX=XVT
  22033.     RETURN
  22034. 7800    CONTINUE
  22035. C FILTER OUT TOO-LARGE ID1, ID2 THAT ARE "REFLECTED" UP
  22036. C        ID=(ID2-1)*60+ID1
  22037.     CALL REFLEC(ID2,ID1,ID)
  22038.         XX=0.
  22039. C NOTE THAT HERE IF FVLD IS 0, THIS MEANS RESULT IS 0 REGARDLESS OF
  22040. C OTHER STUFF...RETURN 0 IMMEDIATELY.
  22041. C NOTE TRICK CALL WHICH SIGNALS ANY INITIALIZATION GETS EVALUATED.
  22042.     CALL FVLDGT(ID,0,LWK)
  22043.     IF(ICHAR(LWK).EQ.0)RETURN
  22044. C SET UP HASH CODE NOW FOR THE WAY WE NEED...
  22045.     IBF=(MVal/100)
  22046. C ibf = blk factor
  22047. C    IBF=(800+49)/50/2
  22048. C    IF(IBF.LT.1)IBF=1
  22049. C
  22050.     LLL=(IPGMAX*2)/IBF
  22051.     IPM=LLL
  22052.     IF(IPM.LE.2)IPM=2
  22053.     IHASH=ID
  22054.         JHASH=MOD(IHASH,(MVlov2))+1
  22055.     IF(IPGMOD.NE.0)GOTO 3402
  22056.         IPAG=(IHASH/(MVlov2))+1
  22057.         IPAG=MOD(IPAG,IPM)+1
  22058.     GOTO 3403
  22059. 3402    CONTINUE
  22060. C SPEED-OPTIMIZING PACKING
  22061.     FPG=IPGMOD
  22062. C    IF(FPG.LE.0)FPG=FPG+65536.
  22063.     FPG=FLOAT(IHASH)*FLOAT(IPM)/FPG
  22064.     IPAG=FPG
  22065.     IPAG=MOD(IPAG,IPM)
  22066.     IPAG=IPAG+1
  22067. C    IPAG=1+(IHASH*IPM)/18060
  22068. 3403    CONTINUE
  22069. C        IF(IPAG.LE.0)IPAG=1
  22070. C TAKE CARE OF EMPTY INITIAL BUFFER...
  22071.     IF(IPAG.EQ.MPAG(1).OR.IPAG.EQ.MPAG(2))GOTO 851
  22072.     IF(MPAG(1).NE.0)GOTO 850
  22073.     MPAG(1)=IPAG
  22074.     GOTO 851
  22075. 850    IF(MPAG(2).EQ.0)MPAG(2)=IPAG
  22076. 851    CONTINUE
  22077.     IF(MPAG(1).EQ.IPAG)GOTO 852
  22078.     IF(MPAG(2).NE.IPAG)GOTO 853
  22079. C MPAG(2)=IPAG
  22080.     MVLAST=2
  22081.     MVBASE=(MVlov2)
  22082.     GOTO 1000
  22083. 852    CONTINUE
  22084.     MVLAST=1
  22085.     MVBASE=0
  22086.     GOTO 1000
  22087. 853    CONTINUE
  22088. C SWITCH BUFFER USED LEAST RECENTLY
  22089.     MVLAST=3-MVLAST
  22090.     MVBASE=MVlov2-MVBASE
  22091. C
  22092. C THE ABOVE ACCOUNTS FOR MEMORY FREE... WE TREAT FILE AS IPM
  22093. C "PAGES" THE SIZE OF THE MEMORY AREA EACH. THIS MAKES IT RELATIVELY
  22094. C EASY TO ALTER THE PROGRAM TO HANDLE MORE MEMORY TO THE EXTENT THE
  22095. C COMPILER AND MACHINE ALLOW.
  22096.     IF(IPGMAX.LE.(MVal/100))GOTO 1000
  22097. C IF HERE, WE NEED A PAGE NOT IN MEMORY. SWAP THE CURRENT MEMORY PAGE
  22098. C TO DISK AND BRING IN THE ONE DESIRED.
  22099. C FILES ARE OPENED ALREADY HERE... USE LUN 9 HERE.
  22100.         IRCLO=(MPAG(MVLAST)-1)*IBF+1
  22101.         IRCHI=MPAG(MVLAST)*IBF
  22102.         L=1+MVBASE
  22103.         DO 500 N=IRCLO,IRCHI
  22104.     IF(MPMOD(MVLAST).EQ.0)GOTO 500
  22105.         LLL=L+(MVlo16)-1
  22106.         WRITE(13,REC=N,ERR=500)((LVALBF(KKK,K),KKK=1,5),K=L,LLL)
  22107.         L=L+(MVlo16)
  22108. 500     CONTINUE
  22109.     MPMOD(MVLAST)=0
  22110. C MARK NEW PAGE UNMODIFIED IN THIS READ PROGRAM
  22111.         MPAG(MVLAST)=IPAG
  22112. C NOW READ IN THE DESIRED RECORD, HAVING SET THE DESIRED IN-MEMORY FLAG
  22113.         IRCLO=(MPAG(MVLAST)-1)*IBF+1
  22114.         IRCHI=MPAG(MVLAST)*IBF
  22115.         L=1+MVBASE
  22116.         DO 501 N=IRCLO,IRCHI
  22117.         LLL=L+(MVlo16)-1
  22118.         READ(13,REC=N,END=501,ERR=501)((LVALBF(KKK,K),KKK=1,5),K=L,LLL)
  22119.         L=L+(MVlo16)
  22120. 501     CONTINUE
  22121. 1000    CONTINUE
  22122. C NOW THE PAGE NEEDED IS IN MEMORY (OR MAY HAVE BEEN ALL ALONG)
  22123. C SET THE VALUE INTO IT AS REQUIRED...
  22124. C NOW START LOOKING AT HASH ADDRESS FOR VARIABLE...LINEAR SEARCH AFTERWARDS
  22125.         IH1=JHASH-1
  22126.         DO 2 MMN=JHASH,(MVlov2)
  22127.     N=MMN+MVBASE
  22128.     NN=N
  22129. C SKIP OUT IF WE SEE VIRGIN CELLS, LEAVING XX=0.
  22130.     KKKKK=LVALBF(1,N)
  22131.     IF(KKKKK.EQ.-1)GOTO 3332
  22132.         IF(KKKKK.EQ.ID)GOTO 4
  22133. 2       CONTINUE
  22134.         IF(IH1.LT.1)RETURN
  22135.         DO 3 MMN=1,IH1
  22136.     N=MMN+MVBASE
  22137. C LOOK BEFORE THE HASHCODE IF NO FREE CELLS AFTER IT.
  22138.     NN=N
  22139.     KKKKK=LVALBF(1,N)
  22140.     IF(KKKKK.EQ.-1)GOTO 3332
  22141.         IF(KKKKK.EQ.ID)GOTO 4
  22142. 3       CONTINUE
  22143. 3332    XX=0.0
  22144.         RETURN
  22145. C RETURN IF CAN'T FIND VALUE...TOO BAD
  22146. 4       CONTINUE
  22147. C GET VALUE AS 4 16-BIT WORDS
  22148.         DO 5 M=1,4
  22149. 5       LL(M)=LVALBF(M+1,NN)
  22150.         XX=XA
  22151.         RETURN
  22152.         END
  22153. c -h- xvblst.f40    Fri Aug 22 13:45:23 1986    
  22154.         SUBROUTINE XVBLST(ID1,ID2,XX)
  22155. C
  22156. C XVBLST - STORE 8 BYTES IN VARIABLES ARRAY
  22157. C GIVEN DIMENSIONS FOR LOCATING THEM
  22158.     Include AParms.Inc
  22159.         InTeGer*4 ID1,ID2
  22160.     InTeGer*4 TYPE(1,1),VLEN(9)
  22161.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1),VT(8)
  22162.     REAL*8 XVT
  22163.     EQUIVALENCE(VT(1),XVT)
  22164.     REAL*8 XXV(1,1)
  22165.     EQUIVALENCE(XXV(1,1),VBLS(1,1,1))
  22166.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  22167.         REAL*8 XX
  22168. C ***<<<< RDD COMMON START >>>***
  22169.     InTeGer*4 RRWACT,RCLACT
  22170. C    COMMON/RCLACT/RRWACT,RCLACT
  22171.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  22172.      1  IDOL7,IDOL8
  22173. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  22174. C     1  IDOL7,IDOL8
  22175.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  22176. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  22177.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  22178. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  22179. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  22180. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  22181.     InTeGer*4 KLVL
  22182. C    COMMON/KLVL/KLVL
  22183.     InTeGer*4 IOLVL,IGOLD
  22184. C    COMMON/IOLVL/IOLVL
  22185. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  22186. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  22187.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  22188.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  22189.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  22190.      3  k3dfg,kcdelt,krdelt,kpag
  22191. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  22192. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  22193. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  22194. C ***<<< RDD COMMON END >>>***
  22195. CCC        InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  22196. CCC        COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  22197. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  22198. C NEXT BITMAPS IMPLEMENT FVLD
  22199.         CHARACTER*1 FV1(Imp1s),FV2(Imp1s),FV4(Imp1s)
  22200.     CHARACTER*1 FVXX(IMPS3)
  22201.     EQUIVALENCE (FV1(1),FVXX(1)),(FV2(1),FVXX(Imp2s))
  22202.     EQUIVALENCE (FV4(1),FVXX(Imp3s))
  22203.         Common/FVLDM/FVXX
  22204. c        COMMON/FVLDM/FV1,FV2,FV4
  22205.         CHARACTER*1 LBITS(8)
  22206.         COMMON/BITS/LBITS
  22207. C THE FOLLOWING BITMAP IS FOR TYPE ARRAY, AND INTEGER ARRAY IS FOR
  22208. C TYPES OF AC'S STORAGE:
  22209.         CHARACTER*1 ITYP(Imp1s)
  22210. C ***<<< NULETC COMMON START >>>***
  22211.     InTeGer*4 ICREF,IRREF
  22212. C    COMMON/MIRROR/ICREF,IRREF
  22213.     InTeGer*4 MODPUB,LIMODE
  22214. C    COMMON/MODPUB/MODPUB,LIMODE
  22215.     InTeGer*4 KLKC,KLKR
  22216.     REAL*8 AACP,AACQ
  22217. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  22218.     InTeGer*4 NCEL,NXINI
  22219. C    COMMON/NCEL/NCEL,NXINI
  22220.     CHARACTER*1 NAMARY(20,MRows)
  22221. C    COMMON/NMNMNM/NAMARY
  22222.     InTeGer*4 NULAST,LFVD
  22223. C    COMMON/NULXXX/NULAST,LFVD
  22224.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  22225.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  22226. C ***<<< NULETC COMMON END >>>***
  22227. CCC    InTeGer*4 ICREF,IRREF
  22228. CCC    COMMON/MIRROR/ICREF,IRREF
  22229.         InTeGer*4 IATYP(27)
  22230.         COMMON/TYP/IATYP,ITYP
  22231. C
  22232. C NEXT ARE BUFFERS FOR HOLDING VALUES, AND MEMORY OCCUPANCY WORDS
  22233. C FOR EACH GIVING THE BLK # IN USE FOR THESE TABLES
  22234. C FORMAT BLOCK (ONE ONLY, 512 BYTES, BUT ORGANIZED AS 76 FORMAT
  22235. C AREAS WITH DATA.
  22236.         CHARACTER*1 LLTST
  22237. C ***<<< KLSTO COMMON START >>>***
  22238.     InTeGer*4 DLFG
  22239. C    COMMON/DLFG/DLFG
  22240.     InTeGer*4 KDRW,KDCL
  22241. C    COMMON/DOT/KDRW,KDCL
  22242.     InTeGer*4 DTRENA
  22243. C    COMMON/DTRCMN/DTRENA
  22244.     REAL*8 EP,PV,FV
  22245.     DIMENSION EP(20)
  22246.     INTEGER*4 KIRR
  22247. C    COMMON/ERNPER/EP,PV,FV,KIRR
  22248.     InTeGer*4 LASTOP
  22249. C    COMMON/ERROR/LASTOP
  22250.     CHARACTER*1 FMTDAT(9,76)
  22251. C    COMMON/FMTBFR/FMTDAT
  22252.     CHARACTER*1 EDNAM(16)
  22253. C    COMMON/EDNAM/EDNAM
  22254.     InTeGer*4 MFID(2),MFMOD(2)
  22255. C    COMMON/FRM/MFID,MFMOD
  22256.     InTeGer*4 JMVFG,JMVOLD
  22257. C    COMMON/FUBAR/JMVFG,JMVOLD
  22258.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  22259.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  22260. C ***<<< KLSTO COMMON END >>>***
  22261. CCC        COMMON/FMTBFR/FMTDAT
  22262.         InTeGer*2 LVALBF(5,MVal)
  22263.         InTeGer*4 MPAG(2),MPMOD(2)
  22264.         COMMON/VB/MPAG,LVALBF,MPMOD
  22265.     InTeGer*4 MFLAST,MFBASE,MVLAST,MVBASE
  22266.     COMMON/VBCTL/MFLAST,MFBASE,MVLAST,MVBASE
  22267.         InTeGer*2 LL(4)
  22268.         REAL*8 XA
  22269.         EQUIVALENCE(XA,LL(1))
  22270. CCC    InTeGer*4 NCEL,NXINI
  22271. CCC    COMMON/NCEL/NCEL,NXINI
  22272.     IF(ID1.GT.27.OR.ID2.GT.1)GOTO 7800
  22273. C AN ACCUMULATOR. SET IT.
  22274.     XVT=XX
  22275.     DO 7801 IV=1,8
  22276. 7801    AVBLS(IV,ID1)=VT(IV)
  22277.     RETURN
  22278. 7800    CONTINUE
  22279. C        ID=(ID2-1)*60+ID1
  22280.     CALL REFLEC(ID2,ID1,ID)
  22281. C SET UP HASH CODE NOW FOR THE WAY WE NEED...
  22282. C       IPM=(IPGMAX*200/800)
  22283.     IF(ID.LE.0)RETURN
  22284. C CALL FVLDGT TO TELL IF ANYTHING IS SET FOR THE CELL...
  22285.     CALL FVLDGT(ID1,ID2,LLTST)
  22286.     IF(ICHAR(LLTST).NE.0)GOTO 3419
  22287.     CALL FVLDST(ID1,ID2,Char(252))
  22288. c 252 = -4 to 8 bits
  22289. C TRICK ... SET UP SIGN BIT IN FVLD SO XVBLGT CAN FIND OUT IF
  22290. C VARIABLE HAS EVER BEEN WRITTEN AND EXIT IF NOT. INDEPENDENT OF
  22291. C USUAL SETTING OF FVLD SINCE IT USES "SIGN" BIT ONLY.
  22292. 3419    CONTINUE
  22293.     IBF=(MVal+99)/100
  22294. C    IBF=(800+49)/50/2
  22295. C    IF(IBF.LT.1)IBF=1
  22296.     LLL=IPGMAX*2/ibf
  22297. C 4000 BYTES PER BUFFER (400 CELLS AT 10 PER CELL)
  22298. C    LLL=(IPGMAX*2)/IBF
  22299.     IPM=LLL
  22300.     IF(IPM.LE.2)IPM=2
  22301.     IHASH=ID
  22302.         JHASH=MOD(IHASH,(MVlov2))+1
  22303.     IF(IPGMOD.NE.0)GOTO 3400
  22304. C SPACE-OPTIMIZING PACKING
  22305.         IPAG=(IHASH/(MVlov2))+1
  22306.         IPAG=MOD(IPAG,IPM)+1
  22307.     GOTO 3401
  22308. 3400    CONTINUE
  22309. C SPEED-OPTIMIZING PACKING
  22310.     FPG=FLOAT(IPGMOD)
  22311. C    IF(FPG.LE.0.)FPG=FPG+65536.
  22312.     FPG=FLOAT(IHASH)*FLOAT(IPM)/FPG
  22313.     IPAG=FPG
  22314.     IPAG=MOD(IPAG,IPM)
  22315.     IPAG=IPAG+1
  22316. C    IPAG=1+(IHASH*IPM)/18060
  22317. 3401    CONTINUE
  22318. C        IF(IPAG.LE.0)IPAG=1
  22319.     IF(IPAG.EQ.MPAG(1).OR.IPAG.EQ.MPAG(2))GOTO 850
  22320.     IF(MPAG(1).NE.0)GOTO 851
  22321.     MPAG(1)=IPAG
  22322.     GOTO 850
  22323. 851    IF(MPAG(2).EQ.0)MPAG(2)=IPAG
  22324. 850    CONTINUE
  22325.     IF(MPAG(1).EQ.IPAG)GOTO 852
  22326.     IF(MPAG(2).NE.IPAG)GOTO 853
  22327. C MPAG(2) = IPAG
  22328.     MVLAST=2
  22329.     MVBASE=(MVlov2)
  22330.     GOTO 1000
  22331. 852    CONTINUE
  22332.     MVLAST=1
  22333.     MVBASE=0
  22334.     GOTO 1000
  22335. 853    CONTINUE
  22336. C NEED NEW PAGE. FIX TO USE LEAST RECENTLY USED PAGE FOR SWAPOUT.
  22337.     MVLAST=3-MVLAST
  22338. C MVLAST = 1 OR 2
  22339.     MVBASE=MVlov2-MVBASE
  22340. C MVBASE = 0 OR 400. INITIALLY 0.
  22341. C        IF(MPAG.EQ.0)MPAG=IPAG
  22342. C THE ABOVE ACCOUNTS FOR MEMORY FREE... WE TREAT FILE AS IPM
  22343. C "PAGES" THE SIZE OF THE MEMORY AREA EACH. THIS MAKES IT RELATIVELY
  22344. C EASY TO ALTER THE PROGRAM TO HANDLE MORE MEMORY TO THE EXTENT THE
  22345. C COMPILER AND MACHINE ALLOW.
  22346. c
  22347.     IF(IPGMAX.LE.IBF)GOTO 1000
  22348. c
  22349. C IF HERE, WE NEED A PAGE NOT IN MEMORY. SWAP THE CURRENT MEMORY PAGE
  22350. C TO DISK AND BRING IN THE ONE DESIRED.
  22351. C FILES ARE OPENED ALREADY HERE... USE LUN 9 HERE.
  22352.         IRCLO=(MPAG(MVLAST)-1)*IBF+1
  22353.         IRCHI=MPAG(MVLAST)*IBF
  22354.         L=1+MVBASE
  22355.         DO 500 N=IRCLO,IRCHI
  22356.     IF(MPMOD(MVLAST).EQ.0)GOTO 500
  22357.         LLL=L+(MVlo16)-1
  22358.         WRITE(13,REC=N,ERR=500)((LVALBF(KK,K),KK=1,5),K=L,LLL)
  22359.         L=L+(MVlo16)
  22360. 500     CONTINUE
  22361. C MARK NEW PAGE MODIFIED SINCE WE WILL TOUCH IT HERE
  22362.     MPMOD(MVLAST)=1
  22363.         MPAG(MVLAST)=IPAG
  22364. C NOW READ IN THE DESIRED RECORD, HAVING SET THE DESIRED IN-MEMORY FLAG
  22365.         IRCLO=(MPAG(MVLAST)-1)*IBF+1
  22366.         IRCHI=MPAG(MVLAST)*IBF
  22367.         L=1+MVBASE
  22368.         DO 501 N=IRCLO,IRCHI
  22369.         LLL=L+(MVlo16)-1
  22370.         READ(13,REC=N,END=501,ERR=501)((LVALBF(KK,K),KK=1,5),K=L,LLL)
  22371.         L=L+(MVlo16)
  22372. 501     CONTINUE
  22373. 1000    CONTINUE
  22374. C NOW THE PAGE NEEDED IS IN MEMORY (OR MAY HAVE BEEN ALL ALONG)
  22375. C SET THE VALUE INTO IT AS REQUIRED...
  22376. C NOW START LOOKING AT HASH ADDRESS FOR VARIABLE...LINEAR SEARCH AFTERWARDS
  22377.     MPMOD(MVLAST)=1
  22378.     IF(NXINI.NE.0)GOTO 111
  22379.         IH1=JHASH-1
  22380.         DO 1 MMN=JHASH,(MVlov2)
  22381.     N=MMN+MVBASE
  22382. C WHILE ZEROING THE ARRAY, START AT THE HASH ADDRESS AND STOP THE ZEROING
  22383. C ONCE WE ENCOUNTER A VIRGIN RECORD. THIS WILL HOPEFULLY REDUCE OVERALL
  22384. C TIME MOST TIMES FOR ZEROING THE ARRAY.
  22385.     KKKKK=LVALBF(1,N)
  22386.     IF(KKKKK.EQ.-1)GOTO 111
  22387.         IF(KKKKK.NE.ID)GOTO 1
  22388. C ZERO ALL REFS TO THIS CELL WE'RE ABOUT TO WRITE.
  22389. C **** THIS IS QUITE TIME CONSUMING... OMIT IF POSSIBLE...
  22390.         LVALBF(1,N)=0
  22391. 1       CONTINUE
  22392.         IF(IH1.LT.1)RETURN
  22393.         DO 33 MMN=1,IH1
  22394.     N=MMN+MVBASE
  22395.     NN=N
  22396.     KKKKK=LVALBF(1,N)
  22397.     IF(KKKKK.EQ.-1)GOTO 111
  22398.         IF(KKKKK.NE.ID)GOTO 33
  22399.     LVALBF(1,N)=0
  22400. 33    CONTINUE
  22401. 111    CONTINUE
  22402. C SINCE ZERO VALUES ARE RETURNED BY DEFAULT, DON'T BOTHER STORING THEM
  22403.     IF(XX.EQ.0.0D0)RETURN
  22404.         IH1=JHASH-1
  22405.         DO 2 MMN=JHASH,(MVlov2)
  22406.     N=MMN+MVBASE
  22407.     NN=N
  22408.     KKKKK=LVALBF(1,N)
  22409.     IF(KKKKK.EQ.-1)GOTO 4
  22410.         IF(KKKKK.EQ.0)GOTO 4
  22411.     IF(KKKKK.EQ.ID)GOTO 4
  22412. 2       CONTINUE
  22413.         IF(IH1.LT.1)RETURN
  22414.         DO 3 MMN=1,IH1
  22415.     N=MMN+MVBASE
  22416.     NN=N
  22417. C LOOK BEFORE THE HASHCODE IF NO FREE CELLS AFTER IT.
  22418.     KKKKK=LVALBF(1,N)
  22419.     IF(KKKKK.EQ.-1)GOTO 4
  22420.         IF(KKKKK.EQ.0)GOTO 4
  22421.     IF(KKKKK.EQ.ID)GOTO 4
  22422. 3       CONTINUE
  22423. C TELL USER VALUE AREA OVERFLOWED, USING ROW 1 END
  22424.     CALL UVT100(1,1,1)
  22425.     CALL SWRT('Value Table Storage overflowed. Try larger file.',48)
  22426.         RETURN
  22427. C RETURN IF CAN'T FIND VALUE...TOO BAD
  22428.  
  22429. 4       CONTINUE
  22430. C SAVE VALUE AS 4 16-BIT WORDS
  22431.         XA=XX
  22432. C SAVE ID AND VALUE IN CELL...
  22433.     LVALBF(1,NN)=ID
  22434.         DO 5 M=1,4
  22435. 5       LVALBF(M+1,NN)=LL(M)
  22436.         RETURN
  22437.         END
  22438. c -h- zero.for    Fri Aug 22 13:46:23 1986    
  22439.     SUBROUTINE ZERO
  22440. C COPYRIGHT (C) 1983 GLENN EVERHART
  22441. C ALL RIGHTS RESERVED
  22442. C 60=MAX REAL ROWS
  22443. C 301=MAX REAL COLS
  22444. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  22445. C VBLS AND TYPE DIMENSIONED 60,301
  22446. C **************************************************
  22447. C *                                                *
  22448. C *         SUBROUTINE  ZERO                       *
  22449. C *                                                *
  22450. C **************************************************
  22451. C
  22452. C
  22453. C
  22454. C  ZEROS OUT ALL VARIABLES EXCEPT %
  22455. C
  22456. C
  22457. C ZERO CALLS IABS
  22458. C
  22459. C
  22460. C ZERO IS CALLED BY CMND
  22461. C
  22462. C
  22463. C
  22464. C   VARIABLE    USE
  22465. C
  22466. C      I      POINTS TO VARIABLE
  22467. C      J      INDEXES DOWN ELEMENTS OF A VARIABLE
  22468. C
  22469. C
  22470. C
  22471. C    SUBROUTINE ZERO
  22472. C
  22473.     InTeGer*4  TYPE(1,1),VLEN(9)
  22474. C
  22475.     CHARACTER*1  AVBLS(20,27)
  22476.     CHARACTER*1 VBLS(8,1,1)
  22477. C
  22478.     COMMON  /V/TYPE,AVBLS,VBLS,VLEN
  22479. C
  22480. C
  22481. C
  22482. C JUST ZERO THE ACCUMULATORS HERE ... LEAVE REGULAR SHEET STUFF ALONE.
  22483. C    TYPE(1,1)=IABS(TYPE(1,1))
  22484.     VBLS(1,1,1)=Char(0)
  22485. C ZERO OUT ACCUMULATORS
  22486.     DO 1 I=1,27
  22487.     DO 1 J=1,20
  22488. 1    AVBLS(J,I)=Char(0)
  22489.     RETURN
  22490.     END
  22491. c -h- zneg.for    Fri Aug 22 13:46:23 1986    
  22492.     INTEGER FUNCTION ZNEG(INDXX)
  22493. C COPYRIGHT (C) 1983 GLENN EVERHART
  22494. C ALL RIGHTS RESERVED
  22495. C 60=MAX REAL ROWS
  22496. C 301=MAX REAL COLS
  22497. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  22498. C VBLS AND TYPE DIMENSIONED 60,301
  22499. C **************************************************
  22500. C *                                                *
  22501. C *        InTeGer*4 FUNCTION ZNEG(INDXX)          *
  22502. C *                                                *
  22503. C **************************************************
  22504. C
  22505. C DETERMINES IF VARIABLE POINTED TO BY INDXX IS ZERO OR NEGATIVE
  22506. C OR UNDEFINED AS OPPOSED TO BEING DEFINED AND POSITIVE
  22507. C
  22508. C     RETURNS      1   IF TRUE (ZERO OR NEGATIVE OR UNDEFINED)
  22509. C                  0   IF FALSE (POSITIVE)
  22510. C
  22511. C ZNEG CALLS ERRMSG TO PRINT ERROR MESSAGES.
  22512. C
  22513. C ZNEG IS CALLED BY CALC AND CMND.
  22514. C
  22515. C   VARIABLE       USE
  22516. C
  22517. C     INDXX      POINTER TO VARIABLE BEING TESTED
  22518. C     I,K        HOLDS TEMPORARY VALUES
  22519. C     ZNEG       RETURN VALUE
  22520. C     INT        HOLD INTEGER*4 VALUES
  22521. C     REAL       HOLD REAL*8 VALUES
  22522. C
  22523. C
  22524. C
  22525. C    INTEGER FUNCTION ZNEG*4(INDXX)
  22526.     REAL*8 REAL
  22527. C
  22528.     INTEGER*4 INT
  22529. C
  22530.     InTeGer*4 TYPE(1,1),VLEN(9),INDXX
  22531. C
  22532.     CHARACTER*1 AVBLS(20,27),FOUR(4),EIGHT(8)
  22533.     CHARACTER*1 VBLS(8,1,1)
  22534. C
  22535.     EQUIVALENCE (EIGHT,REAL),(FOUR,INT)
  22536. C
  22537.     COMMON/V/ TYPE,AVBLS,VBLS,VLEN
  22538. C
  22539. C DEFAULT SETTING OF TRUE
  22540.     ZNEG=1
  22541.     CALL TYPGET(INDXX,1,K)
  22542. C    K=TYPE(INDXX,1)
  22543.     IF(K.GT.0)GO TO 50
  22544. C
  22545. C VARIABLE UNDEFINED
  22546.     CALL UVT100(1,1,1)
  22547.     CALL SWRT('Undefined Vbl',13)
  22548. C    CALL ERRMSG(16)
  22549.     GO TO 10000
  22550. C
  22551. 50    GOTO(100,200,300,300,400,400,400,300,200),K
  22552.     STOP 50
  22553. C
  22554. C ASCII
  22555. 100    IF(AVBLS(1,INDXX).LE.Char(0))GO TO 10000
  22556.     GO TO 9998
  22557. C
  22558. C DECIMAL AND REAL
  22559. 200    DO 210 I=1,8
  22560. 210    EIGHT(I)=AVBLS(I,INDXX)
  22561.     IF(REAL.LE.0.0D0)GO TO 10000
  22562.     GO TO 9998
  22563. C
  22564. C INTEGER, HEX, AND OCTAL
  22565. 300    DO 310 I=1,4
  22566. 310    FOUR(I)=AVBLS(I,INDXX)
  22567.     IF(INT.LE.0)GO TO 10000
  22568.     GO TO 9998
  22569. C
  22570. C MULTIPLE PRECISION
  22571. 400    IF(ICHAR(AVBLS(20,INDXX)).NE.0) GOTO 10000
  22572.     GO TO 9998
  22573. C
  22574. 9998    ZNEG=0
  22575. 10000    RETURN
  22576.     END
  22577.